【问题标题】:What is the best way to design Seller, Category and Product tables?设计卖方、类别和产品表的最佳方法是什么?
【发布时间】:2015-03-15 06:57:52
【问题描述】:

我想存储一个卖家的列表,每个卖家都销售特定类别的产品,然后,每个卖家都会有产品来自这些类别。

设计这个的最佳方式是什么?目前,我有这样设计的三个表,Seller、Category和Product。

如何链接卖家和类别?我觉得我在这里创造了太多的关系。

一种方法是创建一个单独的表,其中包含 SellerId 和 CategoryId 的索引。另外,我想我也需要一个单独的表来存储 SellerId 和 ProductId。有没有更好的方法来处理这种设计?

1 个卖家可以有多个类别,

一个类别可以有多个卖家,

一个类别可以有多个产品,

1 产品可以再次拥有多个卖家,

1 个产品只能有 1 个类别,

最后, 1 个卖家可以拥有多个产品。

【问题讨论】:

  • 关系是多对多的吗?如果任何给定的Seller 可以有多个Category 记录并且任何给定的Category 可以有多个Seller 记录,那么它们之间就需要这样的链接表。那么,我不清楚的是Product 关系。如果ProductCategorySeller 拥有,则无法保证该关系的完整性。 Seller 可能未链接到 CategoryProduct 是否应该仅由 Category 拥有?任何带有CategorySeller 都可以访问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


【解决方案1】:

根据您的更新,考虑这个结构...

Seller
----------
ID
etc.

Product
----------
ID
CategoryID
etc.

SellerProduct
----------
SellerID
ProductID

Category
----------
ID
etc.

在这种情况下:

  1. Seller 和 Product 是聚合根
  2. 一个卖家可以链接到多个产品
  3. 一个产品可以链接到多个卖家
  4. 类别是产品的属性
  5. 卖家通过他们销售的产品隐式“链接”到类别

卖家是否需要链接到该卖家没有产品的类别?如果没有,这个结构应该可以解决问题。如果卖家需要链接到另一个类别,则该卖家只需链接到该类别的产品。

通过将 Category 降级为值类型而不是其自身的实体,您无需将其他实体链接到它。

【讨论】:

    猜你喜欢
    • 2013-06-18
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2011-03-25
    • 2014-01-03
    相关资源
    最近更新 更多