RDBMS:如何为在多个地点拥有不同产品的公司建模
RDBMS: How to model a company having different products at multiple locations
我有一个对所有 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 数据库
规范化规则会告诉您,您的非键属性需要依赖于所有键值(除此之外别无其他)。
如果价格由以下因素决定:
- 制造它的公司
- 销售地点
- 产品实际是什么
那么这意味着 PRICE
需要一个指定公司、位置和生产的候选键。
问题变成了公司、产品和位置之间的关系。还有,关于这三种东西,你还知道什么(你有哪些栏目)?
如果都是完全独立的,比如产品是商品,完全不依赖于公司,地点是独立的经销商,与任何一家公司无关,也与销售什么产品无关在那里,那么真正的单一三向连接可能是你最好的选择。
但是,如果公司、产品和位置之间存在一些 联系,那么您需要适当地规范化这些项目。最后,您可能仍会发现自己很想将价格作为三向连接中的唯一属性。或者,您可能会发现您的数据实际上更加分层(公司的销售地点与在其他地点销售的类似产品在某种有意义的方式上存在根本差异)。在这种情况下,价格 可能 位于树结构的叶层。
如果不更好地了解您的业务规则,很难确定什么最适合您。
底线是,你应该以第三范式 (3NF) 为目标。
你可能想要这样的东西:
我有一个对所有 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 数据库
规范化规则会告诉您,您的非键属性需要依赖于所有键值(除此之外别无其他)。
如果价格由以下因素决定: - 制造它的公司 - 销售地点 - 产品实际是什么
那么这意味着 PRICE
需要一个指定公司、位置和生产的候选键。
问题变成了公司、产品和位置之间的关系。还有,关于这三种东西,你还知道什么(你有哪些栏目)?
如果都是完全独立的,比如产品是商品,完全不依赖于公司,地点是独立的经销商,与任何一家公司无关,也与销售什么产品无关在那里,那么真正的单一三向连接可能是你最好的选择。
但是,如果公司、产品和位置之间存在一些 联系,那么您需要适当地规范化这些项目。最后,您可能仍会发现自己很想将价格作为三向连接中的唯一属性。或者,您可能会发现您的数据实际上更加分层(公司的销售地点与在其他地点销售的类似产品在某种有意义的方式上存在根本差异)。在这种情况下,价格 可能 位于树结构的叶层。
如果不更好地了解您的业务规则,很难确定什么最适合您。
底线是,你应该以第三范式 (3NF) 为目标。
你可能想要这样的东西: