【问题标题】:RDBMS: How to model a company having different products at multiple locationsRDBMS:如何为在多个地点拥有不同产品的公司建模
【发布时间】:2017-07-10 19:41:42
【问题描述】:

我有一个模型所有products 的现有数据库,company 正在生产或消费。数据库很简单:

Table: companies {PK: company_id}
+------------+--------------+
| company_id | company_name |
+------------+--------------+

Table: products {PK: product_id}
+------------+--------------+---------------+
| company_id | product_id   | product_price |
+------------+--------------+---------------+

现在,如果我需要向它添加location 信息,它开始变得复杂。 基本上,现在一个company 有很多locations,每个location 有很多products。

为了使事情更复杂,product 的一些属性例如price 在每个 location 上可能不同。我想分享其他共同属性locations(基本上,我想避免创建在所有三个位置都使用的产品 A 的三个副本)。

我不确定最好的建模方法是什么。我能想到

Table: company_location
+------------+-------------+
| company_id | location_id |
+------------+-------------+

Table: location_product
+-------------+------------+
| location_id | product_id |
+-------------+------------+

但是这种设计不允许product 属性随着location 而改变,除非为每个位置创建完全不同的产品。我也没有办法维护每个company 的主product 列表。

感谢任何帮助。

PS:我使用的是 postgreSQL 数据库

【问题讨论】:

  • 注意:这几乎是 Chris Date 书中的活动扳手示例。

标签: database postgresql database-design relational-database entity-relationship


【解决方案1】:

规范化规则会告诉您,您的非关键属性需要依赖于所有关键值(仅此而已)。

如果价格由以下因素决定: - 制造它的公司 - 出售它的位置 - 产品实际上是什么

那么这意味着PRICE 需要一个指定公司、位置和生产的候选键。

问题变成了公司、产品和地点之间的关系。另外,关于这三种事情,你还知道什么(你有哪些专栏)?

如果它们都是完全独立的,例如,产品是商品,完全不依赖于公司,地点是独立的分销商,与公司或那里销售的产品无关,那么真正的单一三向连接可能是您最好的选择。

但是,如果公司、产品和位置之间存在一些联系,那么您需要适当地规范化这些项目。最后,您可能仍会发现自己很想将价格作为三向连接中的唯一属性。或者,您可能会发现您的数据实际上更具层次性(公司的销售地点与在其他地点销售的类似产品以某种有意义的方式根本不同)。在这种情况下,价格可能存在于树结构的叶层。

如果不更好地了解您的业务规则,真的很难确定什么最适合您。

底线是,您应该瞄准第三范式 (3NF)。

你可能想要这样的东西:

【讨论】:

  • 一个company有几个locations,就像工厂一样。它们都归company 所有,它们不是独立的实体。 products 可能是公司制造的产品,也可能是它使用(材料清单)来制造products 的产品。并非所有locations 都制造或消费companies 主列表中的所有products。此外,product 价格(销售或购买)在不同位置可能不同,但其他属性保持不变。产品的其他属性是 - 名称、描述、购买价格、销售价格、税金等。
  • @CodePoet - 在我看来,公司和位置是一对多相关的 - 换句话说,一个位置不被多家公司共享。然而,对于产品来说,它们是属于公司还是完全独立的,目前还不清楚。如果它们属于公司,那么您可能还希望从公司到位置的一对多。然后你有一个与位置和产品相交的PRICE 表(如果产品是 M:1 与公司)。
猜你喜欢
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多