数据模型:针对字段使用单独的表,而不将其作为主表中的列

时间:2018-08-05 09:57:37

标签: mysql database-design enums data-modeling datamodel

我们有一种情况要存储“状态”(例如“用户”的意思)

我们要对“用户”状态的允许值施加限制。

所以我们考虑了两种选择:

  1. 在“用户”表中将“状态”作为枚举类型的列
  2. 为“状态”有一个单独的表,并在数据库初始化期间填充允许的值,并将其作为“用户”表中的外键。

您能建议哪种方法更好,为什么? 赞赏参考文献是否共享了最佳实践

2 个答案:

答案 0 :(得分:1)

枚举次之。为状态做一个单独的表。使用单独的表,可以轻松更改或添加状态,添加相关数据(如果将来需要,只需在状态表中添加新字段),即可轻松获得不同状态的列表。您还可以选择将主表中的状态字段设置为NULL或默认情况下设置其他值。您可以在其他表中重复使用状态。

如果只有两种状态,例如“活动”和“非活动”,则只需在主表中使用BOOL(或TINYINT)字段类型。

答案 1 :(得分:1)

(有很多关于ENUMTINYINT UNSIGNEDVARCHAR(..)的问答。)

如果选项集不太可能经常更改,则我投票支持ENUM

  • 行为和感觉就像人类可读的字符串。
  • 1个字节。 (我不会用256个以上的选项创建枚举;最多不超过一打。)
  • 我会考虑从选项"unknown"开始,而不是使该列可为空。这是处理输入中拼写错误的粗略方法。

BOOL

  • 可能会打h;我避免了。
  • 在事物的宏伟计划中,它通常无法节省足够的空间来解决问题。
  • 我将考虑将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', |