多个布尔属性与新 table

Multiple boolean attributes vs. New table

我正在设计 mallbrands 之间的关系,可在商场购买。

品牌数量固定。不过,未来可能会增加。现在,一个购物中心可能有 some/all 个品牌。

我的问题是:

我是否应该像这样将不同的品牌作为布尔属性添加到 mall table 中:

mall
----------------------------------------------------------------------------
  mall_id  | mall_name | peter_england |   turle   |   adidas   |   puma   |
---------------------------------------------------------------------------- 
      1         xyz         false          true         true        false
      2         abc         true           false        true        true
----------------------------------------------------------------------------

mall 和新的 brand table 之间创建 N:M 关系,如下所示:

mall                             mall_brand                  brand
-------------------------        ---------------------       --------------------------
  mall_id  | mall_name |          mall_id  | brand_id         brand_id |   brand_name
-------------------------        ---------------------       --------------------------
      1         xyz                  1          2                 1      peter_england
      2         abc                  1          3                 2      turtle
-------------------------            2          1                 3      adidas
                                     2          3                 4      puma
                                     2          4            --------------------------
                                 ---------------------

我个人认为第二个更灵活,因为它只存储 true 个值。此外,它还为我提供了将来为单个品牌添加额外属性的条款。此外,添加新品牌也很巧妙。

编辑:

还要考虑这样一种情况,每个商场都存在所有这些品牌,我们存储的不是布尔值,而是每个品牌平均销售服装数量的浮点值每天这样:

mall
----------------------------------------------------------------------------
  mall_id  | mall_name | peter_england |   turle   |   adidas   |   puma   |
---------------------------------------------------------------------------- 
      1         xyz          10.4          21.3         13.7        7.6
      2         abc          10.7          25.5         11.4        8.1
----------------------------------------------------------------------------

在这种情况下,我应该将它们存储为属性,还是像以前一样创建新的 table?

根据与@Gerrat

的讨论,在一些误解后更新答案

当然第二种更好

第一个 table 是第一范式,因为它的 none 域(字段值)有任何集合作为元素(具有多值的列)。但问题在于重复的列(品牌在 table 中作为列重复只是为了在商场中标记),这样的设计通常被认为是一种反模式,但是因为它限制了 table 到预定的固定数量的值,因为它强制为每个列重复查询和其他业务逻辑。换句话说,它违反了“DRY”的设计原则。

总是尽量使你的数据库易于维护和规范化。

参考资料:

https://en.wikipedia.org/wiki/Database_normalization

https://en.wikipedia.org/wiki/First_normal_form

https://en.wikipedia.org/wiki/Second_normal_form

https://en.wikipedia.org/wiki/Third_normal_form

https://en.wikipedia.org/wiki/Boyce%E2%80%93Codd_normal_form

Normalization: What does "repeating groups" mean?

答案显然是:视情况而定。

在 99% 的情况下,第二个版本是可供选择的。它被适当地标准化,因此相当灵活。 OLTP 系统的发展方向。

如果您正在处理数据仓库,那么第一个版本可能更好,甚至是第三个版本,您基本上可以在第二个版本中获得三个 table 的连接结果版本为 table.