8

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

编辑以澄清:

CREATE TABLE 苹果(id int,weight int,variety varchar(255))

CREATE TABLE 橙子(id int,weight int,variety varchar(255))

或者

CREATE TABLE fruit ( id int, weight int, 品种 varchar(255), type ENUM('apple', 'orange') )

4

3 回答 3

6

取决于约束:

  • apples您是否有不存在的外键或检查oranges(反之亦然)?
  • 您是否需要在两个表中保持键的唯一性(因此 noapple可以具有与 some 相同的 ID orange)?

如果这两个问题的答案是:“是”“否”,请将表分开(这样可以将约束设置为特定于表的1)。

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

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

在此处输入图像描述


1 查找数据是看起来相似的表的典型示例,但必须保持独立,以便 FK 可以保持独立。

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

于 2012-08-30T17:16:28.990 回答
2

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

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

于 2012-08-30T15:38:29.490 回答
1

优点是标准化。然后,您的表格将采用 2NF(第二范式)。你的水果type将是一张桌子的外键,上面有这样的水果:

CREATE TABLE fruit_type (type varchar(15))

CREATE TABLE fruits (id int, weight int, variety varchar(255), type varchar(15))
于 2012-08-30T15:40:41.437 回答