gpt4 book ai didi

mysql - 数据库设计。传递依赖与否?

转载 作者:行者123 更新时间:2023-11-29 01:04:24 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

MyBools (id, firstBool, secondBool);


关于第二种情况,我想出了两个想法,但没有一个让我满意。
我们可以说的主要事情是,当你有很长的序列时,每个 bool 值的列不是很方便。这是我的两个想法:

  1. 具有主键、 bool 字段和自引用外键的单个表:

    MyBools (id, thisBool, idNextBool);

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

  2. 具有主键、 bool 值和自引用外键的单个表:

    MyBools (id, thisBool, idNextBool);

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

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


未规范化:
您可以将这些 bool 值视为数字字段的位(特别是考虑到 bool 值实际上由位表示)。假设我们有两个字段,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

正如您所看到的,您可以将其扩展为尽可能多的 bool 值,只要您可以将其放入数字字段中即可(例如,在 32 位数字字段中,您可以存储 32 个 bool 值,只要每个值都依赖于较低的值) .

关于mysql - 数据库设计。传递依赖与否?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10993320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com