【问题标题】:Two tables with same columns or one table with additional column?两个具有相同列的表或一个具有附加列的表?
【发布时间】:2012-08-25 09:27:26
【问题描述】:

假设我有两个表(Apples 和 Oranges),它们的列相同,只是表名不同。将它变成一个表(假设它称为 Fruit)并带有一个额外的列“type”,然后存储 Apple 或 Orange 的值是否有任何优点/缺点?

编辑澄清:

创建表苹果 ( id int, 重量整数, 变种varchar(255) )

创建表橙子 ( id int, 重量整数, 变种varchar(255) )

创建 TABLE 水果 ( id int, 重量整数, 变种varchar(255), 键入枚举(“苹果”,“橙色”) )

【问题讨论】:

  • 你到底是什么意思。你能用一个数据库例子来问这个问题吗?
  • @CihanKüsmez 添加了一个示例

标签: mysql database database-design


【解决方案1】:

取决于约束:

  • apples 上是否有在 oranges 上不存在的外键或 CHECK(反之亦然)?
  • 您是否需要在两个表中保持键的唯一性(因此,apple 不能与某些 orange 具有相同的 ID)?

如果这两个问题的答案是:“yes”“no”,请将表格分开(这样可以针对表格进行约束 1).

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

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


1Lookup data 是一个典型的表格示例,看起来相似,但必须保持独立,以便 FK 可以保持独立。

2 具体来说,这是表示继承(又名类别、子类化、子类型化、泛化层次结构等)的“单独表中的所有类”策略。您可能想查看this post 了解更多信息。

【讨论】:

    【解决方案2】:

    优点是标准化。然后,您的表格将位于 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))
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 是的,我很可能会使用 ORM,我猜这提示它有利于两个不同的表?
      猜你喜欢
      • 2020-03-04
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 2019-05-16
      • 2015-03-21
      相关资源
      最近更新 更多