Database design 在关系数据库中表示is-a关系
我想知道是否有一种干净的方式来表示is-a关系,如本例所示: 该数据库存储三种类型节目的录制时间:电影、游戏节目和戏剧。在面向对象的意义上,这些都是一个程序。每个子类都有不同的属性。以下是表格(fk前缀表示外键): 电影Database design 在关系数据库中表示is-a关系,database-design,schema,relational,oop,Database Design,Schema,Relational,Oop,我想知道是否有一种干净的方式来表示is-a关系,如本例所示: 该数据库存储三种类型节目的录制时间:电影、游戏节目和戏剧。在面向对象的意义上,这些都是一个程序。每个子类都有不同的属性。以下是表格(fk前缀表示外键): 电影 id 名称 fkDirector 游戏秀 id 名称 fkHost FK选手 戏剧 id 名称 在OO术语中,记录表在某种意义上是这样的: 记录 id fkProgram 开始时间 结束时间 在不违反正常形式的情况下,我能想到的唯一方法是拥有三个记录表,即recordMovie
id
名称
fkDirector
游戏秀
id
名称
fkHost
FK选手
戏剧
id
名称
在OO术语中,记录表在某种意义上是这样的:
记录
id
fkProgram
开始时间
结束时间
在不违反正常形式的情况下,我能想到的唯一方法是拥有三个记录表,即recordMovie、recordGameShow和record戏剧性 有没有一种方法可以在不违反数据库规范化原则的情况下将这些表合并为一个表 以下是一些不起作用的例子来说明这一想法: 节目
id
fkMovie
fkGameShow
电视剧
此表违反了第一个正常形式,因为它将包含null。对于每一行,3个条目中只有一个是非空的 节目
id
fkSpecific← fkMovie或fkGameShow或FK戏剧
fkType← 将指示要查看的表格
在这里,我将无法强制执行引用完整性,因为fkSpecific可能会指向三个表中的一个
我只是想节省三张桌子而不是一张桌子的开销。也许这根本不适用于RDB。是的,这应该是一个表
Programs:
id,
name,
type_id,
length,
etc...
如果有,则提供程序类型的参考表
与类型关联的其他数据位:
ProgramType
type_id,
type_name,
etc...
这是一个非常标准的问题,很多人以前都遇到过,你可能考虑的所有方法都可能在一个时间点完成。
A对每种方法的优缺点都给出了一些很好的解释。我的第一个想法也是使用一个节目表来制作电影、节目和戏剧。然后添加一个ProgramType表,并像父post一样使用外键 还可以添加其他列,如fkDirector、fkMovie。然后添加一个约束,即当ProgramType是电影时,fkDirector不能为null,或者当它是show时,fkHost不能为null 这允许轻松查找所有电影/节目/。。。在开始日期和结束日期之间记录。还要确保所有数据都已填写且参考资料正确无误
谁有更好的主意?为什么要将所有数据存储在一个表中?它们显然是不同的实体。您对主记录表的想法,以及辅助的recordMovie、recordGameShow和Record戏剧性 要在辅助表和主表之间强制执行“is-a”关系,您需要将Record.id声明为所有这些表中的外键,并向其添加一个约束以使其唯一-这强制执行一对一关系,该关系将在主表的扩展中转换这些表
您还需要在主记录表中添加一个新字段,以指示它是什么类型的记录(电影、游戏节目、戏剧、其他?)。这可能是对另一个表(RecordTypes?)的外键引用,也可能是字符串(在它可以接受的值上定义了约束)。这两篇文章都是关于这个主题的好文章:
这就是我最后要做的。我的程序表将是: 节目
身份证 然后我会将fkProgram添加到每个子类(戏剧、游戏和电影)。这样,程序表将成为子类之间的中间表。我可以使用程序表的外键引用任何子类的实例。这将允许我拥有一个记录表,并且不会违反任何正常形式 电影
id
fkProgram
名称
fkDirector
记录
id
fkProgram
开始时间
endTime
在谷歌上搜索“泛化-专业化-关系建模” “gen-spec”模型遵循与“is-a”关系相同的模式 例如,汽车是一种专用车辆。卡车是一种不同类型的专用车辆。摩托车是第三种专用车辆 你应该找到很多文章 有趣的是,如果你只是在google上搜索“gen spec”,最重要的链接之一就是Smalltalk中的gen spec建模描述。+1用于关键字“泛化-专业化-关系建模”