用于存储 MySQL 的多个 BOOLEAN 或一个 BIGINT

Posted

技术标签:

【中文标题】用于存储 MySQL 的多个 BOOLEAN 或一个 BIGINT【英文标题】:Multiple BOOLEANS or one BIGINT for storing MySQL 【发布时间】:2021-11-20 14:25:14 【问题描述】:

我有这些订单行,可以是报价或预订类型。在数据库中的 orderLine 级别上,我想跟踪当前行的类型。我可以创建 2 个布尔值 isQuotationisBooking,它们可以是真或假,或者我可以创建一个 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的主要内容,如果未能解决你的问题,请参考以下文章

更多列,或一列中的多个值 - SQL 数据库?

MySQL 基础

MYSQL 存储过程 - 如果满足某些条件,则更新多个列

mysql必知必会笔记

MySQL必知必会

从存储过程返回多个表