数据库设计中的联合数据类型

时间:2014-03-13 07:50:12

标签: sql database-design

我需要将以下值V存储在数据库中。 V的实例与特定表中的某个记录链接。 V的问题在于它与union type有相似之处,可以指出三件事:

  1. V有一个整数值,表示该值应该用于相关记录。
  2. V不存在,即NULL,表示全局设置优先于有问题的记录。
  3. V的含义为" ANY",表示相关记录不应使用任何值。
  4. 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>
    

1 个答案:

答案 0 :(得分:0)

我会解决它。

Nullable foregn key。并且在foregn密钥表中会有一行表明它具有“任何状态”..例如,所有列都为null。

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

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

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

但最好的建议是永远不要进入这些情况,但我知道并不总是与你的力量相关