数据库设计。是否具有传递依赖性?

时间:2012-06-12 08:54:45

标签: mysql sql database-design

我花了很长时间(超过一年)从数据库设计中休息,我刚刚回来。 我正在为我正在创建的网站设计一个数据库。我在一个表中存储2个布尔值(两个单独的列)。我意识到,如果第一个值为真,另一个值也将始终为真,但如果第一个值为假,则另一个值可以为真或假。就我而言,这不是一个传递依赖,我不应该创建一个新的表,但我想确保我做的一切正确。如果有多个值的行为类似于第二个布尔值,我仍然会将它保存在同一个表中吗? 在数据库中存储此类数据的最佳方法是什么?

如果anwser包含ER图表,我将不胜感激。

4 个答案:

答案 0 :(得分:1)

<强>归一化:
我认为我们应该区分两种情况:

  • 布尔值序列的最大长度== 2;
  • 布尔值序列的最大长度&gt; 2;

第一种情况可以使用一个包含两个字段的表来解决,因为它保证了良好的性能和空间优化(除非你忽略规范化规则,否则你不能保存比这种方式更多的空间,我在最后一个解决方案):

MyBools (id, firstBool, secondBool);


关于第二种情况,我提出了两个想法,其中没有一个我很满意 我们可以说的主要是,当你有很长的序列时,每个布尔值的列都不是很方便。以下是我的两个想法:

  1. 带有PK,布尔字段和自引用外键的单个表:

    MyBools (id, thisBool, idNextBool);
    

    thisBool显然包含一个布尔值。 如果thisBool为真,那么您就不需要存储以下布尔值,因为它的值与第一个值匹配。 如果thisBool为false,则idNextBool指向以下布尔值 此解决方案仅允许向前搜索。

  2. 带有PK,布尔值和自引用外键的单个表:

    MyBools (id, thisBool, idNextBool);
    

    如果idNextBool为空,则表示您已达到序列的第一个值。否则idNextBool指向以下布尔值 此解决方案仅允许向后搜索。

  3. 正如您所看到的,第二种情况的解决方案(超过2个值的序列)相当难以管理 这就是我提出非标准化解决方案的原因。


    未规范化:
    您可以将这些布尔值视为数字字段的位(特别是考虑到布尔值实际上由一个位表示)。假设我们有两个字段field1field2,并认为我们可以将它们放在一个字段中(让我们称之为myfield):

    1) IF field1 is True THEN field2 True         myfield = 0
    
    
                                       __ True      myfield = 10
    2) IF field1 is False THEN field2 /
                                      \__ False       myfield = 11
    

    正如您所看到的,您可以将此扩展为尽可能多的布尔值,因为您可以在数字字段内放置(例如,在32位数字字段中,您可以存储32个布尔值,只要每个布尔值取决于较低的值)

答案 1 :(得分:0)

它不是函数依赖,因此它不是传递函数依赖。

By definition,X - &gt; Y当且仅当每个X值恰好与一个Y值相关联时。

在你的情况下,当X为假时,Y可能是以太真或假,所以上面的定义不成立。


它确实看起来像一个多值依赖。

除了添加适当的CHECK约束之外,我不确定你应该做些什么(对于预期的收益来说,复杂事情的代价会很高。)

答案 2 :(得分:0)

我想到了一个解决方案,但我不知道它是否有任何好处。 如果第一个值为false,我可以使用FK为所有其他值创建另一个表,如果值为true则存储其他值,我可能不会为这些值生成表,因为它们都将为真

答案 3 :(得分:-1)

你的问题有点模糊,但我会试一试。首先,根据您的描述,您没有传递依赖。原因是,当传递依赖需要存在三个属性时,你只提两个,我假设你的表是属性。

当A暗示B时存在传递依赖,B暗示C.换句话说,A暗示C传递给B。

无论如何,我认为寻找具有小数据样本的功能依赖性而没有上下文会导致数据库设计不佳。你桌子里的元素是什么?