超量表 - 多重继承可能吗?

这个问题有可能是一个简单的答案,这是一个标准的练习,或者没有答案,因为它不能用一个简单的理由来完成,或者只是一个有趣的思考练习。我现在坐在最后一个选项上,但希望第一个...... 假设我想在我的数据模型中创建实体的“组”或“类”。一般来说,我会使用这样的超类表:
DrivableEntity
----------
ID (PK, auto-increment)
Type (int or otherwise some kind of enum)

Car
----------
ID (PK, FK to DrivableEntity)
(car-specific fields)

Bike
----------
ID (PK, FK to DrivableEntity)
(bike-specific fields)
然后我的插入可能会通过外部看起来像每个子表的普通CRUD过程,但内部插入到
DrivableEntity
然后使用范围标识插入到目标表中。 作为程序员而不是数据建模者,这让我想到了对象继承。对于直接继承,这很好。可以将公共数据/任务提升到一个级别,可以维护Liskov替换等等。但是在数据模型中是否可以进行多重继承? 我主要是C#开发人员,所以我开始考虑接口。如果我想要公开“已实现”tables2ѭ和/或
ITowable
等的表,该怎么可能?以前有人做过这样的事吗?     
已邀请:
通常,数据模型的两种方法适用于您所描述的内容。 您已经描述的模型是其中一种方法,并且具有非常“整洁”的好处。如果表中有大量列,则它的工作特别好,因此单个对象的大小不会太大或太宽。
DrivableEntity
----------
ID (PK, auto-increment)
Type (int or otherwise some kind of enum)

Car
----------
ID (PK, FK to DrivableEntity)
(car-specific fields)

Bike
----------
ID (PK, FK to DrivableEntity)
(bike-specific fields)
另一种方法是将所有列都保留在单个表中,并使用类型指示符标记每一行。这种方法可能会很快变得混乱,但对于简单的情况,其开销要小得多。 您可以在原始模型中建模继承或接口,只需将另一个外键列添加到“派生”实体之一即可。例如:
FlyableEntity
-------------
ID (PK)
... flyable attributes

FlyingCar (implements/inherits IDrivable and IFlyable)
-------------
DrivableEntityID (PK, FK)
FlyableEntityID (PK, FK)
... add flying car attributes

or:

FlyingCar (inherits from Car)
-------------
CarID (PK, FK)
FlyableEntityID (FK)
... add flying car attributes
    
大卫, 实体框架具有使用继承的能力。这是实体框架中继承的良好概述。您可以将POCO与EF一起使用来创建自己的接口以提供对数据的访问。 您描述的情况实际上不是多重继承,因为您有一个基表/实体和派生表/实体。要在EF中对此进行建模,请创建基本实体,然后创建每个子实体。此时,您可以将每种类型的子实体propreties映射到正确的表。 话虽如此,您的插入/更新/删除逻辑将变得非常复杂。实体框架可能会遇到复杂模型的问题。 我要问的问题是,你为什么要这样做?如果要在类型之间共享公共数据,我建议在服务器上创建使用子表连接父表的视图。它会更快,并且您可以使用而不是触发器来处理CUD(创建/更新/删除)操作,这将使SQL更容易,因为数据访问和数据存储之间存在明显的分离。 这有意义吗? 埃里克     
您可以创建视图来解决此问题。 viewDriveableCar ViewDrivabaleBike ViewTowableCar 然后将视图组合成使用联合组合可驱动和可牵引实体的超视图。您只能包含两者中常见的列。类似但不同的名称需要规范化:
CREATE VIEW vrDiveTow
AS

SELECT
viewDriveableCar.CarId as ID,
... other attributes

UNION

SELECT
viewTowableCar.TowableId as ID,
... other attributes
UNION
一个大问题。 SQL使用可以缓存的查询计划来生成结果。如果SQL的查询计划是围绕查询'Seven-Up'构建的,并且您正在过滤'Coke',则查询计划无效,并且会动态使用全表扫描。     
可以进行子类型化,但也不鼓励。数据库是他们自己的世界,你不应该试图将OOP原则带入那个世界。许多人尝试过,许多人都失败了。如果您尝试以OOP术语考虑数据库“对象”,您的数据库将受到影响。     

要回复问题请先登录注册