我正在研究数据库设计,发现自己有很多 *_type 表(例如 user_type、product_type 等),其中这些表的结构基本相同:
user_type (
id int pk
label char
)
Run Code Online (Sandbox Code Playgroud)
我可以通过执行以下操作来简化此操作:
labels (
id int pk
label char
context blah
)
Run Code Online (Sandbox Code Playgroud)
但这是一个合适的方式来做到这一点吗?
请不要合并各种_type表格。您未来的自己(以及最终针对表格编写查询的任何人)都会感谢您。
我更愿意写一些类似的东西
SELECT p.product_name,
pt.product_type_name,
ct.color_name
FROM product p
JOIN product_type pt ON (p.product_id = pt.product_id)
JOIN color_type ct ON (p.color_id = ct.color_id)
Run Code Online (Sandbox Code Playgroud)
比
SELECT p.product_name,
pt.label product_type_name,
ct.label color_name
FROM product p
JOIN (SELECT *
FROM labels
WHERE context = 'PRODUCT_TYPE') pt ON (p.product_id = pt.id)
JOIN (SELECT *
FROM labels
WHERE context = 'COLOR_TYPE') ct ON (p.color_id = ct.id)
Run Code Online (Sandbox Code Playgroud)
_type表放在一起,则数据库可处理的信息往往会少得多,因此选择最有效的计划的可能性就会大大降低。除此之外,我完全赞同@BillThor 关于如何创建各种查找表的建议。