我想在MySQL上存储两种信息:
1)包含字段A,B,C,D的信息
2)字段C,D,E,F的信息
我应该为每种类型的信息创建两个表,还是应该只创建一个包含字段A,B,C,D,E,F和空记录的表,具体取决于输入的信息是类型1还是类型2 ?
Table_info_1
id
field_A
field_B
field_C
field_D
Table_info_2:
id
field_C
field_D
field_E
field_F
或
Table_info_1_and_2:
id
field_A
field_B
field_C
field_D
field_E
field_F
information_type (1 or 2)
答案 0 :(得分:0)
这取决于。如果A,B,C,D和C,D,E,F之间的关系不是1:1,那么你没有其他选择,而是定义了两个单独的表。如果将它们设计为单个表,您是否会有可能的冗余数据?如果是,那么最好将它们分成两个表。如果不是,那么您可能决定将它们全部放入一个表中,因为您不想经常加入它们。此外,概念性也是一个因素。 A,B和E,F是否描述了同一个实体?如果是这样,那么它们可以在同一个表中。如果没有,那么你可以将它们分开。您是否很少使用其中一对(A,B)和(E,F),但很常见的是另一对?如果是这样,那么你可以将它们分开。如果没有,他们可以留在一张桌子里。正如您所看到的,有很多层,或者,如果您愿意,可以分析您的问题,结果可能是矛盾的。这一切都恢复到常青经济问题:如果我们看一下利益与损害之间的区别,哪个决策具有更高的价值?
答案 1 :(得分:0)
当您决定使用两个不同的表时:
考虑其他名为Table_info_User
的表要查找这两个表(Table_info_1中的外键和Table_info_User中的Table_info_2)的情况。
设计关系有两种选择:
当您决定使用单个表时(将其称为Table_info_all
)
您最终会在表格中包含许多可以为空的列,其中一些在概念上是强制性的,设计将不是正常形式(特别是2NF)。
当Table_info表的数量超过2时,所有问题都会更加明显。
替代解决方案:(inheritance)
您可能有一个名为Table_info_base
的基表,其中包含其他人的共享属性
其他Table_info表将是基表的子表,它们将具有其特定列
Table_info_base和Table_infox之间的零或一关系将是服务器
在基表中使用鉴别器列将增强设计。
Table_info_User将具有与此Table_info_base表的强制外键关系 设计将处于正常状态,不必要的无效列将消失