数据模型:字段有单独的表,而主表中有一列

tsm1rwdh  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(411)

我们有一个场景,我们想存储“状态”(比如说“用户”)
我们想对“用户”状态的允许值施加限制。
所以我们考虑了两种选择:
在“user”表中将“status”作为枚举类型的列
有一个单独的“status”表,并在db初始化期间填充允许的值,并将其作为“user”表中的外键。
您能否建议哪种方法更好,以及为什么要感谢大家分享关于什么是最佳实践的参考资料

z9ju0rcb

z9ju0rcb1#

枚举不是首选项。为状态做一个单独的表格。使用一个单独的表,可以很容易地更改或添加状态,添加相关数据(如果将来需要,只需在状态表中添加一个新字段),很容易获得不同状态的列表。您还可以选择将主表中的状态字段设置为null,或者默认设置为其他值。可以重用其他表中的状态。
如果只有两种状态,比如“active”和“inactive”,只需在主表中使用bool(或tinyint)字段类型。

3npbholx

3npbholx2#

(有很多问答辩论 ENUMTINYINT UNSIGNEDVARCHAR(..) .)
如果这套方案不太可能经常改变,那么我投赞成票 ENUM .
行为和感觉就像一根人类可读的弦。
1字节(我不会使用256+个选项进行枚举;甚至不超过,比方说,一打。)
我会考虑从选项开始 "unknown" 而不是使列为空。这是一种处理输入中拼写错误的粗糙方法。 BOOL :
可能会打嗝;我避开它。
在事物的大计划中,它通常不会节省足够的空间来处理问题。
我会考虑使用 SET 或者 *INT 对于大量布尔标志。
任何基数较差的列(enum/tinyint/bool)单独在索引(如 INDEX(status) . 综合指数可能有用,例如 INDEX(status, create_date) .
枚举示例
遇到的某些枚举有2个以上的选项;你判断他们是好是坏:

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', |

相关问题