具有公共字段的两种信息的数据库表设计

时间:2014-05-14 00:30:02

标签: database-design

我想在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)

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_X提供一个外键列 Table_info_User:你最终会得到null的外键,同时必须填充其中一个,但是你将无法在设计中显示约束。
  • Table_info_User中的所有Table_info_X都有一个列,没有外键约束:您将放弃数据完整性,使用该模式将显示更多问题!

当您决定使用单个表时(将其称为Table_info_all
您最终会在表格中包含许多可以为空的列,其中一些在概念上是强制性的,设计将不是正常形式(特别是2NF)。

当Table_info表的数量超过2时,所有问题都会更加明显。

替代解决方案:(inheritance
 您可能有一个名为Table_info_base的基表,其中包含其他人的共享属性 其他Table_info表将是基表的子表,它们将具有其特定列 Table_info_base和Table_infox之间的零或一关系将是服务器 在基表中使用鉴别器列将增强设计。

Table_info_User将具有与此Table_info_base表的强制外键关系 设计将处于正常状态,不必要的无效列将消失 enter image description here