我们有一种情况要存储“状态”(例如“用户”的意思)
我们要对“用户”状态的允许值施加限制。
所以我们考虑了两种选择:
您能建议哪种方法更好,为什么? 赞赏参考文献是否共享了最佳实践
答案 0 :(得分:1)
枚举次之。为状态做一个单独的表。使用单独的表,可以轻松更改或添加状态,添加相关数据(如果将来需要,只需在状态表中添加新字段),即可轻松获得不同状态的列表。您还可以选择将主表中的状态字段设置为NULL或默认情况下设置其他值。您可以在其他表中重复使用状态。
如果只有两种状态,例如“活动”和“非活动”,则只需在主表中使用BOOL(或TINYINT)字段类型。
答案 1 :(得分:1)
(有很多关于ENUM
与TINYINT UNSIGNED
与VARCHAR(..)
的问答。)
如果选项集不太可能经常更改,则我投票支持ENUM
。
"unknown"
开始,而不是使该列可为空。这是处理输入中拼写错误的粗略方法。 BOOL
:
SET
或*INT
用于大量的布尔标志。具有低基数的任何列(枚举/ tinyint /布尔)都不能单独用于诸如INDEX(status)
之类的索引中。 OTOH,复合索引可能很有用,例如INDEX(status, create_date)
。
ENUM示例
遇到的一些枚举有两种以上的选择;您可以判断它们的好坏:
Database Column ENUM
| mysql | sql_data_access | enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') |
| mysql | interval_field | enum('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND |
| mysql | ssl_type | enum('','ANY','X509','SPECIFIED') |
| performance_schema | TIMER_NAME | enum('CYCLE','NANOSECOND','MICROSECOND','MILLISECOND','TICK') |
| common_schema | hint_type | enum('step_into','step_over','step_out','run') |
| common_schema | statement_type | enum('sql','script','script,sql','unknown') |
| mworld | Continent | enum('Asia','Europe','North America','Africa','Oceania','Antarctic |
| try | priority | enum('LOW','NORMAL','HIGH','UBER') |
| alerts | Stage | enum('DISCOVER','NOTIFY','ACK','CLEAR') |
| todo | stage | enum('unk','load','priming','running','stopping') |
| zip | z_type | enum('STANDARD','UNIQUE','','PO BOX ONLY','Community Post Office', |