【问题标题】:Database design of companies, products, accessories and associations公司、产品、配件和协会的数据库设计
【发布时间】:2014-10-22 06:02:19
【问题描述】:

我正在尝试为几家公司生产的产品、它们的配件以及产品和配件与客户帐户的关联设计一个数据库。

您将如何设计这样一个数据库来实现此功能?

业务规则

  • 一个产品总是与一个公司相关联,一个公司可以有很多产品。
  • 除产品外,公司还可能有配件,在某些情况下,还有这些配件的组合(捆绑包)。
  • 公司产品可以与同一公司的一个或多个配件相关联,也可以与这些配件的组合(捆绑)相关联。
  • 客户可以将一种不带附件的产品关联到他的帐户,或者将一种产品与一个或多个附件或捆绑包(附件的组合)关联。

我的方法

访问https://www.dropbox.com/s/mmxqzgagbw1sek1/Ejemplo.png?dl=0

为了实现只有现有的产品与附件/捆绑包的组合才能与用户限制相关联,我在代码中添加了以下业务规则:如果该组合存在于 products_accessories 中,则该组合是合格的;否则代码会触发错误

最后,为了使产品和配件/捆绑包的所有可能组合符合条件,由产品和配件组成的表 (products_accessories) 具有以下复合主键:(id、product_id 和 accessory_id)。

例如:

我有 p1 产品和以下附加组件:a1、a2 和 a3。 a1 和 a3 可以组合。在本例中,products_accessories 表如下所示:

| id | product_id | accessory_id |
|----|------------|--------------|
| 1  | p1_id      | a1_id        |
| 2  | p1_id      | a2_id        |
| 3  | p1_id      | a3_id        |
| 4  | p1_id      | a1_id        |
| 4  | p1_id      | a3_id        |

【问题讨论】:

  • 一个产品可能不属于一家公司?
  • 不,产品永远属于公司。
  • 在这种情况下,我将删除关系 product-accessory
  • 好的,但是如果我删除关系,我怎么知道可以与产品关联的附件?并非公司的所有配件都可以与公司的所有产品相关联。
  • 每个配件都属于一家公司,所以您可以直接处理配件

标签: mysql sql database database-design relational-database


【解决方案1】:

我建议采用“材料清单”类型的方法。

    +-------------+
    | COMPANIES   |
    +-------------+
    | #company_id |
    +-------------+
           |
  +--------^--------+   +-----------------+   +------------+
  | PRODUCTS        |---< CLIENT_PRODUCTS >---| CLIENTS    |
  +-----------------+   +-----------------+   +------------+
  | #product_id     |   | #client_id      |   | #client_id |
  | #company_id     |   | #product_id     |   +------------+
  |  is_offereable  |   | #company_id     |
  +-----------------+   +-----------------+
        |     |
+---------------------+
| PRODUCT_BUNDLES     |
+---------------------+
| #parent_product_id  |
| #child_product_id   |
| #company_id         |
|  quantity           |
+---------------------+
  • 公司
    • PK:company_id
  • 产品
    • PK:product_id、company_id
    • FK:company_id REFERENCES COMPANIES company_id
  • PRODUCT_BUNDLES
    • PK:parent_product_id、child_product_id、company_id
    • FK:parent_product_id、company_id 参考产品 product_id、company_id
    • FK:child_product_id、company_id 参考产品 product_id、company_id
  • 客户
    • PK:client_id
  • 客户_产品
    • PK:client_id、product_id、company_id
    • FK:client_id REFERENCES CLIENTS client_id
    • FK:product_id、company_id 参考产品 product_id、company_id

company_id 包含在 PRODUCTS PK 中,因此只有来自同一公司的产品可以捆绑。

产品表最初包括单个产品和单个附件。同一家公司的单个产品和配件可以捆绑在一起形成新的“产品”。这些新的“产品”可能反过来与单个产品或配件或其他捆绑包捆绑在一起,形成更多的“产品”。

is_offerable 标志指示单个产品、附件或捆绑包是否可以与客户相关联。

您还可以通过在 PRODUCTS 表中设置产品类型列并确保仅 PRODUCT 类型的产品或包含至少一种 PRODUCT 的捆绑包与客户相关联,从而限制哪些产品与客户相关联。

【讨论】:

  • 好的,但是如果客户只能将一种不带附件的产品关联到他的帐户,或者将一种产品与一个或多个捆绑包关联,则不需要 client_product 表?
  • CLIENT_PRODUCTS 表是必要的,因为客户可以提供多个“产品”,例如“产品 1”、“带有附件 A 的产品 1”和“带有附件 A 和 B 的产品 1”和一个产品可以由多个客户提供。仅当所有客户仅提供一种产品或所有产品仅由一位客户提供时才不需要 CLIENT_PRODUCTS 表,这似乎不是业务规则。
猜你喜欢
  • 2020-04-29
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 2012-05-27
  • 2017-04-30
  • 2014-02-12
相关资源
最近更新 更多