【问题标题】:What is the best way to represent a three-choice option in a database?在数据库中表示三选项的最佳方式是什么?
【发布时间】:2012-07-09 14:10:56
【问题描述】:

我有一个只能处于三种状态的对象列表。

数据的简化示例:

Substance State
H2O  solid
H2O  fluid
CO2  gas
...  ...

使用TINYINT(2)ENUM 或其他什么更好?我应该按原样插入值(VARCHAR)还是使用数字?外部值表?

【问题讨论】:

    标签: mysql database-design


    【解决方案1】:

    我会通过 ID 引用外部表。然后该表将信息显示为文本。 在您的选择语句中,您只需加入即可。如果你不知道我在说什么,可以问我一个例子:)

    不过,出于各种原因,我不会使用 ENUM。在这里找到最重要的:http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/

    【讨论】:

    • 如果需要,请设置为最佳答案或投票?谢谢你:)
    【解决方案2】:

    任何内容都不会存储在少于一个字节中。

    TINYINT(2) 和具有 3 个成员的 ENUM 都将产生 1 个字节的存储空间。两者都可以。

    ENUM 的好处是您可以使用简单的英文名称,并且它们存储紧凑。 ENUM 的坏处是它们不是 ANSI SQL。

    【讨论】:

    • 对不起,我对这些东西很陌生。 > ENUM 的好处是……它们存储紧凑。更紧凑?我的数据库中有大约 10 个这样的字段,将选择存储在 ENUM 中而不是外部表中会更好吗?
    • 如果你有 1 到 255 个选项,MySQL 将使用 1 个字节。如果您有 256 到 32,767 个选项,MySQL 将使用 2 个字节。
    • 我指的是另一种领域。例如。状态(固体、流体、气体)、颜色(红、绿、蓝)、尺寸(小、中、大)等
    【解决方案3】:

    创建一个主表作为状态(id int,desc varchar), 根据问题 它会有

    id   |  desc
    1    |  Solid
    2    |  Liquid
    3    |  Gas
    

    并在解决方案(主)表中引用状态表的 id

    【讨论】:

    • 我的数据库中大约有 10 个这样的字段,对性能来说还可以吗?
    【解决方案4】:

    我认为您可以将信息存储在 BIT 类型的列中,并允许在

    列。以下是价值与你的数据的映射。

    H2O 固体 --> 是的

    H2O 流体 --> 错误

    二氧化碳气体 --> NULL

    【讨论】:

    • 这有什么下降的原因吗??
    • 可能是因为 BIT 和 TINYINT 之间的差异为零,同时过于 hackish。对于一些值,ENUM 仍然是更好的整体答案。
    • 是的,但是使用 BIT 有什么问题?? stackoverflow.com/questions/488811/tinyint-vs-bit
    • 因为使用 NULL 来表示一个实际值,总有一天你会在 TDWTF 中受到当之无愧的嘲讽。对于实际的二进制列,没问题,除非它们被扩展。
    • 因为几乎可以肯定的是,下周将弹出存储“CO”的要求,而您被卡住了。所有假设可以为空的 BIT 的报告都必须重做,等等......
    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2010-11-25
    • 2021-12-29
    相关资源
    最近更新 更多