两个具有相同列的表或一个具有附加列的表?

时间:2012-08-30 15:33:17

标签: mysql database database-design

假设我有两个表(苹果和橘子),它们具有相同的列,只有一个不同的表名。是否有任何优点/缺点将其转换为一个表(简称其称为Fruit),并附加一个“类型”列,然后存储Apple或Orange的值?

编辑以澄清:

创建表苹果 ( id int, 重量int, 品种varchar(255) )

CREATE TABLE橙子 ( id int, 重量int, 品种varchar(255) )

OR

CREATE TABLE水果 ( id int, 重量int, 品种varchar(255), 输入ENUM('apple','orange') )

3 个答案:

答案 0 :(得分:5)

取决于约束:

  • apples上是否有[{1}}上没有的外键或CHECK(反之亦然)?
  • 您是否需要在两个表中保持密钥唯一(因此oranges不能与某些apple具有相同的ID?)

如果这两个问题的答案是:“是”“否”,请将表格分开(因此可以使表格特定于 1 )。

如果答案是:“否”“是”,请将它们合并在一起(这样您就可以创建一个跨越两者的密钥)。

如果答案是:“是”“是”,请考虑模仿继承 2

enter image description here


1 Lookup data是表格相似的典型示例,但必须保持分开,以便FK可以分开。

2 具体来说,这是表示继承的“用于单独表中的所有类”策略(也就是类别,子类,子类型,泛化层次等)。您可能需要查看this post以获取更多信息。

答案 1 :(得分:2)

如果确实没有任何进一步的业务规则(以及由此产生的基础数据要求)将两个子类型分开,那么我将使用一个带有fk的表到FruitType查找表。

您没有提到您将使用什么来访问可能影响您采用哪种方法的架构(例如,如果您使用的是为您的数据库提供ORM的平台,那么这可能值得注意)。

答案 2 :(得分:1)

优点是规范化。那么你的表格将是2NF(second normal form)。 你的水果type将成为一张桌子的外键,上面有这样的水果:

CREATE TABLE fruit_type (type varchar(15))

CREATE TABLE fruits (id int, weight int, variety varchar(255), type varchar(15))