SQL: 在应用程序中或在单独的 table 中存储数据字段选择?

SQL: store data field choices in application or in separate table?

给出以下 SQL table:

Ticket:
- id (primary)
- state
- created

我想将状态限制为一组预先确定的选择,例如打开、待定、关闭。给定的状态是否应该存储为每个 table 行的单个字符串,这取决于应用程序来决定允许哪些字符串(选择)?或者状态应该是一个单独的 table 的外键,它存储所有允许的值,例如:

Ticket:
- id (primary)
- state (foreign)
- created

TicketState
- id (primary)
- name

第二个选项似乎更好,但对于具有大量选择的大型 tables 来说,这些 "extra" tables 的数量似乎增长迅速。对此最常见的方法是什么?

ONE TABLE:您多久添加、删除或重命名 TicketState 的名称?您打算将来使用 MySQL 以外的任何数据库吗?如果不是,ENUM 是 MySQL 的朋友。

TWO TABLES:即使单独制作TicketState,它也不会随着Ticket的增长而增长。它将由可能状态的数量固定。它可能需要额外的连接,但风险较小(推荐)

我几乎总是使用外键进行查找 table。虽然您可以使用 CONSTRAINT 来限制列(例如,限制为 'open'、'pending、'closed'),但这种方法既隐藏了业务逻辑,也使添加附加值变得更加困难如果您的要求发生变化。

INT 集群主键上 JOIN 到 table 的成本非常小,我认为以劣质设计为代价试图避免这种情况是一个明显的过早优化案例。