给出以下SQL表:
Ticket:
- id (primary)
- state
- created
我想将状态限制为一组预定的选择,例如打开,挂起,关闭。是否应将给定状态存储为每个表行的单个字符串,具体取决于应用程序以决定允许哪些字符串(选项)?或者状态应该是存储所有允许值的单独表的外键,例如:
Ticket:
- id (primary)
- state (foreign)
- created
TicketState
- id (primary)
- name
第二种选择似乎更好,但对于有大量选择的大型表,似乎这些“额外”表的数量迅速增长。最常见的方法是什么?
答案 0 :(得分:1)
ONE TABLE:您多久添加,删除或重命名TicketState的名称?你打算将来使用除MySQL以外的任何数据库吗?如果没有,ENUM是你的MySQL朋友。
两个表:即使你单独制作TicketState,它也不会随着Ticket的增长而增长。它将由可能的状态数量来确定。它可能需要额外加入,但风险较小(推荐)
答案 1 :(得分:1)
我几乎总是将外键用于查找表。虽然您可以使用CONSTRAINT
来限制列(例如,打开','待处理,'已关闭'),但这两者都隐藏了业务逻辑和如果您的需求发生变化,也会使添加其他值变得更加困难。
JOIN
群集主键上INT
表的成本非常小,我认为以低劣设计为代价来避免这种情况是一个明显的过早优化的例子