使用DBs,SQL:table";“继承”;分离决策
假设我有一个数据库,其中一个实体(即表)继承自另一个实体,例如:使用DBs,SQL:table";“继承”;分离决策,sql,database-design,single-table-inheritance,class-table-inheritance,Sql,Database Design,Single Table Inheritance,Class Table Inheritance,假设我有一个数据库,其中一个实体(即表)继承自另一个实体,例如: 表1,名为人:(姓名) 表2,命名为车主 在这种情况下,车主继承自个人,即车主是个人。 我现在必须决定是否应该: 创建表car\u owner,即使它除了person中的列之外没有其他列,但在将来这可能会改变=>这样做会导致car\u owner=带有列的表(id,person\u id),其中person\u id是FK到person 或 现在只保留person表,只在出现car owner额外信息时执行(1) 我正在处理的
,名为表1
:人
(姓名)
,命名为表2
车主
车主
继承自个人
,即车主
是个人
。
我现在必须决定是否应该:
创建表car\u owner
,即使它除了person
中的列之外没有其他列,但在将来这可能会改变=>这样做会导致car\u owner
=带有列的表(id,person\u id)
,其中person\u id
是FK
到person
或
现在只保留person
表,只在出现car owner
额外信息时执行(1)
我正在处理的表有不同的名称和语义,(1)和(2)之间的选择不清楚,因为在car\u owner
中可能永远不会弹出额外的列
从概念上讲,(1)似乎是正确的选择,但我想问的是,如果我改用(2)的话,我以后是否会遇到任何严重的问题。我建议选择1是更好的答案。虽然它创建了更多的工作来连接表以进行查询,但将“可选”数据放在自己的表中更为整洁。如果需要更多类型的人(行人、汽车司机、汽车乘客),可以为他们提供更多的儿童桌。您始终可以使用视图使它们看起来像一张表
顺便说一句,对于数据库,我们说的是父和子,而不是“固有的”
回答选项2的问题/后果部分-嗯,不太严重。这是一个数据库,所以您可以随时在以后重新安排事情,但如果您重新构造表,那么在重写查询和代码时将要付出代价。我之所以不喜欢选项2,是因为它会导致额外的表不重复使用person部分。如果这张表看起来是给车主的,我可能会为汽车乘客制作一个全新的表,并复制所有的person列。
简而言之,任何一种方法都不应该发生太悲惨的事情,因为不同的原因,它们都是可取的,缺点主要是不便和潜在的未来混乱。车主是由个人扮演的角色。一个人可以(同时)扮演许多角色。此外,公司/组织可以拥有汽车;)@NeilMcGuigan我似乎无法从你的评论中得出与我的问题相关的结论,要不要重新措辞?请阅读一些现成的模式:你正在寻找政党模式(有角色)谢谢,观点正确,但过于笼统-我仍然不相信选择(2)以后不会导致严重的问题-所谓严重,我的意思是必须在调整表/查询/代码上花费大量精力..另外…我不太同意car_乘客示例-我认为从表名-“person”-中的行表示persons:)可以清楚地看出,让我们更详细地讨论您的问题。您说过car\u owner
的列与person
的列相同。如果您确实有完全相同的列(可能是姓名、年龄、地址等),那么我将使用一个表,添加一个person\u type
列来标记此人为车主。但是,只要您需要另一个特定于车主的列,那么您可能应该创建另一个表。您绝对不应该在这两个表中都添加name、age和address列。规则是只将每种类型的信息存储在一个位置。在person表中添加标志(“角色”)从来都不是一个选项,也不是从person表中复制数据/列……我在这里要问的是,在某些情况下,选择选项(2)意味着以后必须花大量精力调整内容,当需要一个特定于“车主”的栏出现时。我想问的是,将来把事情搞砸的可能性有多大(2)=>特别是……)我知道你的意见是,它几乎没有潜力这样做,但我自己也不太相信