【问题标题】:Database design - storing equivalence数据库设计——存储等价
【发布时间】:2017-06-15 09:18:57
【问题描述】:
我正在为一个系统设计关系数据库,该系统存储有关某些类型的产品、零售商和零售商的供应商的信息。
一些供应商销售相同的产品 - 但是,他们没有识别产品的标准,这意味着供应商 A 的产品可能具有 id 618261,相当于供应商 B 的产品 007162。
问题是,我不想为不同的供应商多次存储相同的产品。目前,我有以下表格:
等价
- supplier1_id
- supplier2_id
- supplier1_product_id
- supplier2_product_id
产品
- id(生成)
- supplier_id
- supplier_product_id
这似乎是个坏主意。每当将某些东西插入“产品”时,
- 必须查询“等价”才能找到每个等价物
- 必须查询“产品”以查找是否已存储等效产品
- 如果没有找到同等产品,可以插入产品
有没有更聪明的方法来做到这一点?
【问题讨论】:
标签:
database
database-design
relational-database
【解决方案1】:
这种情况并不少见,不同的供应商很多时候都会有自己的相同产品的 SKU 编号。此外,一个产品可能有不同的制造商,每个制造商都有自己的部件号。但让我们只看供应商。
简单地说,一个供应商可能会提供许多产品,而一个产品可能会从许多供应商处获得。这种多对多关系是通过交叉表或交叉表来维护的。如果您考虑一下,SKU 编号不是产品实体或供应商实体的属性。相反,它是关系的一个属性。是的,关系可能与任何实体一样具有属性。
create table ProductSupplier(
ProductID int not null references Products( ID ),
SupplierID int not null references Suppliers( ID ),
UnitPrice currency not null,
SKU varchar
);
UnitPrice 很可能是每单位价格的列表,这些价格会根据订购的数量而有所不同。因此它很可能在另一个表中——我在此处添加它以显示额外的供应商-产品关系属性。
再次用简单的英语,该表中的一个元组表示:“this 来自 this 供应商的产品具有 this SKU 编号。” p>