【发布时间】:2015-03-15 06:57:52
【问题描述】:
我想存储一个卖家的列表,每个卖家都销售特定类别的产品,然后,每个卖家都会有产品来自这些类别。
设计这个的最佳方式是什么?目前,我有这样设计的三个表,Seller、Category和Product。
如何链接卖家和类别?我觉得我在这里创造了太多的关系。
一种方法是创建一个单独的表,其中包含 SellerId 和 CategoryId 的索引。另外,我想我也需要一个单独的表来存储 SellerId 和 ProductId。有没有更好的方法来处理这种设计?
1 个卖家可以有多个类别,
一个类别可以有多个卖家,
一个类别可以有多个产品,
1 产品可以再次拥有多个卖家,
1 个产品只能有 1 个类别,
最后, 1 个卖家可以拥有多个产品。
【问题讨论】:
-
关系是多对多的吗?如果任何给定的
Seller可以有多个Category记录并且任何给定的Category可以有多个Seller记录,那么它们之间就需要这样的链接表。那么,我不清楚的是Product关系。如果Product由Category和Seller拥有,则无法保证该关系的完整性。Seller可能未链接到Category。Product是否应该仅由Category拥有?任何带有Category的Seller都可以访问Product? -
是的。这些关系是多对多的。因此,我可以继续在 Category 和 Seller 之间创建一个 Junction 表,但我还需要存储来自特定卖家的 Products。所以,本质上,1个卖家可以有多个分类,1个分类可以有多个卖家,1个分类可以有多个产品,1个产品可以再有多个卖家,1个产品只能有1个分类,最后,1个卖家可以有多个产品[用这个用例更新了问题]
-
我担心的是,这些关系最终可能会相互“撒谎”。卖家 1 可以链接到类别 A,但可以拥有属于类别 B 的产品 X。结构中没有任何内容可以阻止这种情况的发生。在这种情况下,类别真的应该是一个实体吗?还是只是查找?例如,如果产品由卖方拥有(产品上的卖方的 FK)并且产品具有类别(产品上的类别的 FK),业务逻辑是否会得到满足。这将在卖方和类别之间创建一个隐含链接,就像卖方产品类别的聚合一样。
-
这很有意义。但是,我想保持 Product 实体没有重复。在这种情况下,可能有卖家 A、B 和 C,他们都在销售类别“书籍”中的产品 1。在这种情况下,我最终将存储 3 条产品记录。有没有办法避免这种情况?
标签: mysql database database-design foreign-key-relationship