Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用DBs,SQL:table";“继承”;分离决策_Sql_Database Design_Single Table Inheritance_Class Table Inheritance - Fatal编程技术网

使用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)=>特别是……)我知道你的意见是,它几乎没有潜力这样做,但我自己也不太相信