公司,产品,配件和协会的数据库设计

时间:2014-08-28 11:28:44

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

我正在尝试为几家公司制造的产品,他们的配件以及产品和配件与客户帐户的关联设计数据库。

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

业务规则

  • 产品始终与公司相关联,公司可以拥有多种产品。
  • 除了产品外,公司还可能有配件,在某些情况下,还有这些配件(捆绑)的组合。
  • 公司产品可以与同一家公司的一个或多个配件相关联,也可以与这些配件(捆绑)的组合相关联。
  • 客户可以将一件产品与其帐户相关联,但不附带配件或产品与一件或多件配件或捆绑件(配件组合)的关联。

MY APPROACH

访问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        |

1 个答案:

答案 0 :(得分:2)

我建议使用'物料清单'类型方法。

    +-------------+
    | 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           |
+---------------------+
  • COMPANIES
    • 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
  • CLIENT_PRODUCTS
    • 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作为产品PK的一部分包含在内,因此只能捆绑同一公司的产品。

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

is_offerable标志表示单个产品,附件或捆绑包是否可能与客户关联。

您还可以通过在PRODUCTS表上设置产品类型列来限制哪些产品与客户关联,并确保只有PRODUCT类型的产品或包含至少一个PRODUCT的产品类与客户关联。