我们有一个场景,我们想存储“状态”(比如说“用户”)我们想对“用户”状态的允许值施加限制。所以我们考虑了两种选择:在“user”表中将“status”作为枚举类型的列有一个单独的“status”表,并在db初始化期间填充允许的值,并将其作为“user”表中的外键。您能否建议哪种方法更好,以及为什么要感谢大家分享关于什么是最佳实践的参考资料
z9ju0rcb1#
枚举不是首选项。为状态做一个单独的表格。使用一个单独的表,可以很容易地更改或添加状态,添加相关数据(如果将来需要,只需在状态表中添加一个新字段),很容易获得不同状态的列表。您还可以选择将主表中的状态字段设置为null,或者默认设置为其他值。可以重用其他表中的状态。如果只有两种状态,比如“active”和“inactive”,只需在主表中使用bool(或tinyint)字段类型。
3npbholx2#
(有很多问答辩论 ENUM 与 TINYINT UNSIGNED 与 VARCHAR(..) .)如果这套方案不太可能经常改变,那么我投赞成票 ENUM .行为和感觉就像一根人类可读的弦。1字节(我不会使用256+个选项进行枚举;甚至不超过,比方说,一打。)我会考虑从选项开始 "unknown" 而不是使列为空。这是一种处理输入中拼写错误的粗糙方法。 BOOL :可能会打嗝;我避开它。在事物的大计划中,它通常不会节省足够的空间来处理问题。我会考虑使用 SET 或者 *INT 对于大量布尔标志。任何基数较差的列(enum/tinyint/bool)单独在索引(如 INDEX(status) . 综合指数可能有用,例如 INDEX(status, create_date) .枚举示例遇到的某些枚举有2个以上的选项;你判断他们是好是坏:
ENUM
TINYINT UNSIGNED
VARCHAR(..)
"unknown"
BOOL
SET
*INT
INDEX(status)
INDEX(status, create_date)
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', |
2条答案
按热度按时间z9ju0rcb1#
枚举不是首选项。为状态做一个单独的表格。使用一个单独的表,可以很容易地更改或添加状态,添加相关数据(如果将来需要,只需在状态表中添加一个新字段),很容易获得不同状态的列表。您还可以选择将主表中的状态字段设置为null,或者默认设置为其他值。可以重用其他表中的状态。
如果只有两种状态,比如“active”和“inactive”,只需在主表中使用bool(或tinyint)字段类型。
3npbholx2#
(有很多问答辩论
ENUM
与TINYINT UNSIGNED
与VARCHAR(..)
.)如果这套方案不太可能经常改变,那么我投赞成票
ENUM
.行为和感觉就像一根人类可读的弦。
1字节(我不会使用256+个选项进行枚举;甚至不超过,比方说,一打。)
我会考虑从选项开始
"unknown"
而不是使列为空。这是一种处理输入中拼写错误的粗糙方法。BOOL
:可能会打嗝;我避开它。
在事物的大计划中,它通常不会节省足够的空间来处理问题。
我会考虑使用
SET
或者*INT
对于大量布尔标志。任何基数较差的列(enum/tinyint/bool)单独在索引(如
INDEX(status)
. 综合指数可能有用,例如INDEX(status, create_date)
.枚举示例
遇到的某些枚举有2个以上的选项;你判断他们是好是坏: