我在数据库设计方面休息了很长时间(超过一年),而我才刚刚回来。我正在为我正在创建的网站设计一个数据库。我将2个布尔值存储在一个表中(两个单独的列)。我意识到,如果第一个值为true,则另一个值也将始终为true,但如果第一个值为false,则另一个值可能为true或false。就我而言,这不是一个可传递的依赖,我不应该创建一个新的表,但我想确保我做的一切都是正确的。如果有多个值的行为类似于第二个布尔值,我还会将其保留在同一个表中吗?在数据库中存储此类数据的最佳方式是什么?
如果anwser包含ER图,我将不胜感激。
发布于 2012-06-12 17:20:30
规范化的:
我认为我们应该区分两种情况:
第一种情况可以使用具有两个字段的单个表来解决,因为它保证了良好的性能和空间优化(您不能比这种方式节省更多的空间,除非您忽略规范化规则,我在上一个解决方案中就是这样做的):
MyBools (id, firstBool, secondBool);对于第二种情况,我提出了两个想法,但都不满意。
我们能说的主要事情是,当你有很长的序列时,每个布尔值对应一列并不是很方便。以下是我的两个想法:
MyBools (id,thisBool,idNextBool);
thisBool显然包含一个布尔值。如果thisBool为真,您就完成了,您不需要存储以下布尔值,因为它的值与第一个值匹配。如果thisBool为false,则idNextBool指向以下布尔值。
此解决方案仅支持正向搜索。
MyBools (id,thisBool,idNextBool);
如果idNextBool为null,则表示已到达序列的第一个值。否则,idNextBool指向以下布尔值。
此解决方案仅允许反向搜索。
正如您所看到的,第二种情况(序列长度超过2个值)的解决方案相当难以管理。
这就是为什么我提出了一个非规范化的解决方案。
未规范化的:
您可以将这些布尔值视为数值字段的位(特别是考虑到布尔值实际上是由位表示的)。假设我们有两个字段,field1和field2,并考虑我们可以将它们放在一个字段中(让我们称之为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个布尔值,只要每个值都依赖于较低的值)。
发布于 2012-06-12 17:25:06
它不是函数依赖,因此它不是传递函数依赖。
By definition,X -> Y当且仅当,每个X值恰好与一个Y值相关联。
在您的例子中,当X为false时,Y可能为true或false,因此上面的定义不成立。
但它看起来确实像一个多值依赖项。
除了添加适当的检查约束之外,我不确定您是否应该对此做些什么(对于预期的收益来说,使事情复杂化的成本太高了)。
发布于 2012-06-12 23:35:07
我想出了一个解决方案,但我不知道它是否好。如果第一个值为false,我可以使用FK为所有其他值创建另一个表,如果该值为true,则存储其他值。我不能为这些值生成表,因为它们无论如何都将为true
https://stackoverflow.com/questions/10993320
复制相似问题