用于存储 MySQL 的多个 BOOLEAN 或一个 BIGINT
Posted
技术标签:
【中文标题】用于存储 MySQL 的多个 BOOLEAN 或一个 BIGINT【英文标题】:Multiple BOOLEANS or one BIGINT for storing MySQL 【发布时间】:2021-11-20 14:25:14 【问题描述】:我有这些订单行,可以是报价或预订类型。在数据库中的 orderLine 级别上,我想跟踪当前行的类型。我可以创建 2 个布尔值 isQuotation
和 isBooking
,它们可以是真或假,或者我可以创建一个 type
字段,其中 0 = quotation
等。根据最佳实践,最好的方法是什么?
【问题讨论】:
您的条目可以同时是报价和预订(或您将来发明的一些潜在的附加状态)吗? (或者,换句话说,isQuotation = 1 和 isBooking = 1 是否有意义,或者总是一个状态为真?) @Solarflare 不,它只能同时是一个状态,但是可能会添加更多状态(这可能会使数据库膨胀) 【参考方案1】:type ENUM('quotation', 'booking') NOT NULL
允许 2 个选项占用一个字节。它可以通过type = 'booking'
之类的东西进行测试。我通常更喜欢添加第三个选项而不是允许NULL
:
type ENUM('unknown', 'quotation', 'booking') NOT NULL
对于最多 256 个选项,它仍然需要 1 个字节。
BIGINT
占用 8 个字节;矫枉过正。
type SET('quotation', 'booking') NOT NULL
占用 1 个字节并允许 4 种选择——包括两者都没有。
NULL
可能不需要;只需使用空集。 Set 限制为 64 个独立选项,需要 8 个字节。
有些人不赞成使用ENUM
,所以我将提到TINYINT UNSIGNED
作为一个1 字节的替代方案,限制为256 个选项。然后,您可以使用另一个表格将数字映射到人类友好的字符串。
【讨论】:
以上是关于用于存储 MySQL 的多个 BOOLEAN 或一个 BIGINT的主要内容,如果未能解决你的问题,请参考以下文章