【问题标题】:Multiple boolean attributes vs. New table多个布尔属性与新表
【发布时间】:2015-06-27 10:56:00
【问题描述】:

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

品牌数量是固定的。但是,未来可能会增加。现在,商场可能会展示一些/所有品牌。

我的问题是:

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

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

mall 和一个新的brand 表之间创建 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
----------------------------------------------------------------------------

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

【问题讨论】:

  • 我几乎总是更喜欢第二个正确标准化的模型。它更加灵活且易于使用。
  • 还有一个查询:如果所有品牌始终为true,但存储任何其他数据类型,例如puma_avg_shoe_priceadidas_avg_shoe_pricereebok_avg_shoe_price 等等,我们仍然会选择第二个设计?
  • 请在每个帖子中提出一个问题,而不是 3 个。请通过编辑而不是 cmets 进行澄清。

标签: database database-design


【解决方案1】:

在与@Gerrat 的讨论中出现一些误解后更新答案

当然第二种方式更好。

第一个表处于第一范式,因为它的所有域(字段值)都没有任何集合作为元素(具有多值的列)。但问题在于重复的列(品牌在表中重复为列只是为了在商场中标记),这种设计通常被认为是一种反模式,但是因为它将表限制为预定的固定数量的值并且因为它强制为每一列重复查询和其他业务逻辑。换句话说,它违反了“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?

【讨论】:

  • 感谢您提到第一个 NF(为每组相关数据创建单独的表格)。
  • 还有一个查询:如果所有品牌始终为true,但存储任何其他数据类型,例如puma_avg_shoe_priceadidas_avg_shoe_pricereebok_avg_shoe_price 等等,我们仍然会选择第二个设计?
  • 您可以将 mall_brand 替换为 mall_brand_price,其中包含 mall 和品牌的 id 以及价格(或 mall_brand_product_price ...)
  • @Jens,是的,这很公平,但如果所有品牌始终存在怎么办。我正在考虑所有这些品牌都在商场里的情况。在这种情况下,将它们作为属性添加不是更好吗?
  • 嗯,情况相同,伙计,这些仍然是重复的列。在这种情况下,您将如何列出品牌名称?此外,如果您的商场中有 100 个品牌,那么您的表格将是 100 列,假设您只设置浮点值,如果您想为每个品牌添加名称和位置,这将添加另外 200 列到你的桌子。为品牌实体创建一个单独的表是最佳解决方案,您可以将所需的所有属性作为列添加到此表中。
【解决方案2】:

答案很明显:视情况而定。

在 99% 的情况下,第二个版本是可以选择的。它被适当地规范化,因此相当灵活。 OLTP 系统的必经之路。

如果您正在处理数据仓库,那么第一个版本可能会更好,甚至第三个版本,您基本上可以将第二个版本中的三个表的连接结果作为一个表。

【讨论】:

  • 感谢您提及两种设计都适用的情况。
  • 还有一个查询:如果所有品牌始终为true,但存储任何其他数据类型,例如puma_avg_shoe_priceadidas_avg_shoe_pricereebok_avg_shoe_price 等等,我们仍然会选择第二个设计?
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2018-05-13
  • 2018-07-03
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多