Inheritance 请帮助我连接继承和关系概念

Inheritance 请帮助我连接继承和关系概念,inheritance,rdbms,Inheritance,Rdbms,我正在和我的一个程序员朋友谈论继承及其在设计模型中的使用。他是一个很大的支持者,而我则有点不温不火。主要是因为我倾向于自下而上地设计系统:数据库->应用程序->演示文稿(老实说,我不是一个前端人员,所以我经常将演示文稿完全留给其他人)。我发现,如果没有与其他表的大量1对1关系,关系数据库系统就不支持继承 如果我是从概念的角度进行设计,管理员就是用户就是人。从数据库开始,管理员是UserType=“Administrator”的用户。协调这些方法对我来说似乎很困难,因此我只对非持久化对象使用继承

我正在和我的一个程序员朋友谈论继承及其在设计模型中的使用。他是一个很大的支持者,而我则有点不温不火。主要是因为我倾向于自下而上地设计系统:数据库->应用程序->演示文稿(老实说,我不是一个前端人员,所以我经常将演示文稿完全留给其他人)。我发现,如果没有与其他表的大量1对1关系,关系数据库系统就不支持继承


如果我是从概念的角度进行设计,管理员就是用户就是人。从数据库开始,管理员是UserType=“Administrator”的用户。协调这些方法对我来说似乎很困难,因此我只对非持久化对象使用继承

我的想法怎么了?如果继承与传统的关系结构有着内在的不兼容性,为什么继承是OO的一个广受关注的方面?或者,是我没有正确地将继承映射到关系数据吗?有没有什么指导可以帮我澄清这一点


很抱歉提出了这个漫无边际的问题,并提前感谢您的回答。如果你在回复中包含代码,C#就是我的“母语”

用C#表达这种关系有很多方法。关系数据库的局限性更大(这可能是一个优点,也可能是一个缺点)。当您设计要在数据库中持久化的对象层次结构时,我发现通常更容易首先从数据库模式开始,因为几乎任何数据库模式都可以轻松映射到对象关系,而事实并非如此


在这种特殊情况下,您可以使用合成为管理员建模。Administrators表将提供任何附加的管理状态以及相应用户的密钥。用户FK也将是您的管理员主键。

有多种继承方式。开发人员可以从接口和行为的角度来考虑

在您的世界中,拥有“用户类型”的管理员意味着什么

您可能暗示的语义是,某些代码在某处看到该用户类型,并授权具有该类型的用户的操作。那么,也许管理员可以创建其他用户

在这种情况下,开发人员可能有一个类用户

class User() { viewData(){ ...} ; signReport() {...} }
还有一个具有额外功能的类管理员

class Administrator()  extends User {  createUser() {...}; approvePurchase() {...} }
Administrator类型的对象可以在用户可以使用的任何地方使用。这种多态行为在实现时可能会有所帮助。现在,您的数据库似乎支持这种情况。但是,当管理员执行特定任务只需要一点额外数据时,您会怎么做?例如,purchaseApproval()已达到某个限制,我们需要将该限制作为新字段,但它仅适用于管理员


我相信你的“类型”概念所暗示的行为方面常常与额外的数据有关

这被通俗地称为

模式继承-大多数关系数据库不支持模式继承。虽然理论上可以添加这样一个特性来减少与OOP的冲突,但关系支持者不太可能相信层次分类法和子类型的效用,因为他们倾向于认为基于集合的分类法或分类系统比树更强大、更灵活。OO倡导者指出,继承/子类型化模型不必局限于树(尽管这在许多流行的OO语言(如Java)中是一个限制),但非树OO解决方案被视为比关系数据库首选的基于集合的主题变化管理技术更难制定。至少,它们不同于关系代数中常用的技术

另请参见:,

您应该阅读。它将向您展示如何用关系结构表达继承模式

要记住的重要一点是继承是概念建模的事情。关系结构和OO代码只是这些概念模型的具体化,不应该被认为是面向对象的全部。


这里有一个关于这类事情的讨论。

关系范式和面向对象范式之间的鸿沟经常被讨论

基本上,为了提供RDBMS和OO之间的映射,必须牺牲两个系统的一些功能。你必须决定你的妥协更倾向于哪一方


这两种范式都非常强大和有用。但是试图在它们之间无缝地映射是一个尚未解决的问题。

是的,在映射到数据库和从数据库映射时,继承可能不是正确的工具

在构建框架时,继承更为有用,在框架中,不同类型的对象表现不同,但它们仍然有共同的部分

例如,您可以在一台服务器和另一台服务器之间传递不同的“消息”。每个消息都有自己的逻辑,所以您需要不同的类(以避免出现巨大的switch()语句),但也有一些共同的部分,比如每个消息都需要知道如何将自身序列化/反序列化为流(这是消息的所有子类都必须覆盖的方法)。 另外,让所有消息继承消息将让您拥有一个列表,并逐个调用它们的序列化方法,例如

但如果您所做的只是典型的业务/DB逻辑,那么继承很可能会妨碍您

为什么继承如此重要 OO的著名方面(如果有) 这些固有的不兼容性与 传统的关系结构

这是一句奇怪的话——为什么你说关系结构是“传统的”?从本质上讲,它们是RDBMS中的标准,但我在非DB语言的上下文中很少看到关系库