2014-03-13 42 views
1

我需要将以下值V存储在数据库中。 V的一个实例与特定表中的特定记录相链接。采用V的问题是,它有一个相似的union type并能指出三两件事:数据库设计中的联合数据类型

  1. V有一个整数值,这意味着该值应该用于有问题的记录。
  2. V不存在,即NULL,这意味着全局设置优先于所讨论的记录。
  3. V的含义是“ANY”,意思是没有值应该用于记录中。

1和2很容易(使其成为一个NULLable整数列),但如何处理3?现在我不愿意使用一个特殊的数值来表示ANY状态,例如, -1和0是1的情况下

了什么浮现在脑海中至今完全有效的值是

  • 把这个联盟类型到具有两列,一个数值和一个单独的表对于任何条件(布尔值)和一个可翻译的外键引用。
  • 将其存储为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> 

回答

0

我会因为无论是解决这个问题。

可为空的foregn键。在foregn键表中会有一行表明它具有“任何状态”,例如所有列都为空。

或加入一个int /布尔列来激活一个过度状态。

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

我已经看到了这个问题,很多解决方案和所有的人有严重的问题。这永远不会是美丽的。并尝试针对即将消耗此混乱的代码量身定制您的解决方案。尽可能简单。在这些情况下,可读性是重要的。

但最好的建议是从来没有进入这些情况,但我知道是不是总是wihtin你的力量

+0

因此很明显,没有银弹这一个...我结束了主办这次设立一个单独的表值,以避免具有隐藏逻辑的一些神奇的varchar列。接受这个答案作为确认我的假设的奖励:) –