我们说我有下表:
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
这样做不好吗?如果是这样,做类似事情的首选方式是什么?
答案 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)动态构建查询之外)。
花一些时间来分析您的表格以及它们之间的关系。从你的例子中扩展,人与宠物/动物之间存在“多对一”的关系,因为人们可以拥有一种以上的动物,但动物不能拥有一个以上的所有者。如果动物可以拥有多个所有者,那么你就拥有“多对多”的关系。
在架构术语中,您的架构可能在最基本的层次上看起来像这样:
<强>居民强>
<强>动物强>
从它的外观来看,你会有不同类型的动物需要不同的属性(例如爬行动物不会有fur_color选项)。你可以添加另一个像@barmar建议的表。但是,我会忽略人类属性,并将它们与Residents表保持一致。
<强> AnimalAttributes 强>
此设置的唯一缺点是,您必须勤奋并确保属性存在,例如你不要忘记为Fluffy创建一个fur_color记录。
如果动物和人之间存在多对多的关系,您需要一个中间表并从Animals表中删除OwnerID列。
<强>所有权强>