【问题标题】:Union data type in database design数据库设计中的联合数据类型
【发布时间】:2014-04-17 19:29:24
【问题描述】:

我需要将以下值 V 存储在数据库中。 V 的一个实例与某个表中的某个记录相关联。 V 的问题在于它与union type 相似,并且可以指示三件事:

  1. V 有一个整数值,这意味着该值应该用于相关记录。
  2. V 不存在,即 NULL,这意味着全局设置优先于相关记录。
  3. V 的含义是“ANY”,这意味着不应为相关记录使用任何值。

1 和 2 很容易(使其成为 NULLable 整数列),但是如何处理 3 呢?现在我觉得用一个特殊的数值来表示 ANY 状态不舒服,因为例如-1 和 0 是案例 1 的完全有效值。

目前想到的是

  • 将此联合类型放入一个单独的表中,该表具有两列,一列用于数值,一列用于 ANY 条件(布尔值),以及对其的可空外键引用。
  • 将其存储为 VARCHAR 列并为任何状态使用一些特殊字符(例如“*”)。

有没有“行业标准”的方式来做到这一点? :)

作为参考,这个联合类型在 XSD 表示中看起来像这样:

<complexType name="V">
    <choice>
        <element name="anyValue" type="xs:string" fixed="" />
        <element name="numericValue" type="xs:int" />
    </choice>
</complexType>

<complexType name="E">
    <sequence>
        <element ... />
        <element ... />
        <element name="configValue" type="V" minOccurs="0" />
    </sequence>
</complexType>

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

    我会解决它。

    可以为空的外键。并且在外键表中会有一行表明它具有“任何状态”..例如所有列都为空。

    或添加一个 int/boolean 列来指示一个覆盖状态。

    请不要使用 varchar 链接到其他表...

    我已经看到了很多解决这个问题的方法,而且它们都有严重的问题。这永远不会很漂亮。并尝试为将消耗这种混乱的代码定制您的解决方案。让它尽可能简单。在这些情况下,可读性是王道。

    但最好的建议是永远不要陷入这些情况,但我知道这并不总是在你的权力范围内

    【讨论】:

    • 所以显然这个没有灵丹妙药......我最终设置了一个单独的表来托管这个值,以避免出现一些带有隐藏逻辑的神奇 varchar 列。接受这个答案作为确认我的假设的奖励:)
    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多