首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库设计。传递依赖还是非传递依赖?

数据库设计。传递依赖还是非传递依赖?
EN

Stack Overflow用户
提问于 2012-06-12 16:54:45
回答 4查看 592关注 0票数 3

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-12 17:20:30

规范化的

我认为我们应该区分两种情况:

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

第一种情况可以使用具有两个字段的单个表来解决,因为它保证了良好的性能和空间优化(您不能比这种方式节省更多的空间,除非您忽略规范化规则,我在上一个解决方案中就是这样做的):

代码语言:javascript
复制
MyBools (id, firstBool, secondBool);

对于第二种情况,我提出了两个想法,但都不满意。

我们能说的主要事情是,当你有很长的序列时,每个布尔值对应一列并不是很方便。以下是我的两个想法:

  1. 包含主键、布尔值字段和自引用外键的单个表:

MyBools (id,thisBool,idNextBool);

thisBool显然包含一个布尔值。如果thisBool为真,您就完成了,您不需要存储以下布尔值,因为它的值与第一个值匹配。如果thisBool为false,则idNextBool指向以下布尔值。

此解决方案仅支持正向搜索。

  • 单个表,其中包含一个主键、一个布尔值和一个自引用外键:

MyBools (id,thisBool,idNextBool);

如果idNextBool为null,则表示已到达序列的第一个值。否则,idNextBool指向以下布尔值。

此解决方案仅允许反向搜索。

正如您所看到的,第二种情况(序列长度超过2个值)的解决方案相当难以管理。

这就是为什么我提出了一个非规范化的解决方案。

未规范化的

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-06-12 17:25:06

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

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

在您的例子中,当X为false时,Y可能为true或false,因此上面的定义不成立。

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

除了添加适当的检查约束之外,我不确定您是否应该对此做些什么(对于预期的收益来说,使事情复杂化的成本太高了)。

票数 0
EN

Stack Overflow用户

发布于 2012-06-12 23:35:07

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10993320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档