使用值作为另一个表的标题 - 这是不好的做法吗?

时间:2014-04-17 03:41:16

标签: mysql

我们说我有下表:

Table: Residents

ID   Name    Species
-------------------
1    Bob      Human
2    Fluffy   Cat
3    Laura    Human

根据物种的不同,我想参考另一张表格了解更多信息。物种列下给出的值是相应表的名称。

Table: Cat

id     owner_id    fur_color
----------------------------
2        1          white


Table: Human

id      email
---------------
1       bob@gmail.com
3       laura@gmail.com

这样做不好吗?如果是这样,做类似事情的首选方式是什么?

2 个答案:

答案 0 :(得分:0)

最好有一个属性和值的通用表:

表:属性:

id  owner_id    attr    value
1   1           email   bob@gmail.com
2   3           email   laura@gmail.com
3   2           fur_color white

答案 1 :(得分:0)

简而言之,是的。正如@barmar在他的评论中提到的那样,没有办法将列值连接到表名(在使用脚本语言(如PHP)动态构建查询之外)。

花一些时间来分析您的表格以及它们之间的关系。从你的例子中扩展,人与宠物/动物之间存在“多对一”的关系,因为人们可以拥有一种以上的动物,但动物不能拥有一个以上的所有者。如果动物可以拥有多个所有者,那么你就拥有“多对多”的关系。

在架构术语中,您的架构可能在最基本的层次上看起来像这样:

<强>居民

  • ID
  • 名称
  • 电子邮件

<强>动物

  • ID
  • OwnerID(必须与Residents表中的ID匹配)
  • 名称

从它的外观来看,你会有不同类型的动物需要不同的属性(例如爬行动物不会有fur_color选项)。你可以添加另一个像@barmar建议的表。但是,我会忽略人类属性,并将它们与Residents表保持一致。

<强> AnimalAttributes

  • ID
  • AnimalID(必须与Animals表中的ID匹配)
  • 属性

此设置的唯一缺点是,您必须勤奋并确保属性存在,例如你不要忘记为Fluffy创建一个fur_color记录。

如果动物和人之间存在多对多的关系,您需要一个中间表并从Animals表中删除OwnerID列。

<强>所有权

  • ID
  • OwnerID(必须与Residents表中的ID匹配)
  • AnimalID(必须与Animals表中的ID匹配)