假设我有两个表(苹果和橘子),它们具有相同的列,只有一个不同的表名。是否有任何优点/缺点将其转换为一个表(简称其称为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') )
答案 0 :(得分:5)
取决于约束:
apples
上是否有[{1}}上没有的外键或CHECK(反之亦然)?oranges
不能与某些apple
具有相同的ID?)如果这两个问题的答案是:“是”和“否”,请将表格分开(因此可以使表格特定于 1 )。
如果答案是:“否”和“是”,请将它们合并在一起(这样您就可以创建一个跨越两者的密钥)。
如果答案是:“是”和“是”,请考虑模仿继承 2 :
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))