2014-08-28 115 views
0

我想設計一個由幾家公司,他們的配件和產品和配件與客戶的帳戶的協會製造的產品的數據庫。公司,產品,配件和協會的數據庫設計

你將如何設計這樣的數據庫來實現這個功能?

業務規則

  • 的產品總是與一個公司,一個公司可以有多種產品。
  • 除了產品,公司也可能有配件,並在某些情況下,這些配件(捆綁)的組合。
  • 公司產品可以與同一家公司的一個或多個配件或與這些配件(捆綁)的組合相關聯。
  • 客戶可以將一件產品與其賬戶相關聯,而無需配件或將產品與一件或多件配件或捆綁件(配件的組合)相關聯。

我的做法

訪問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  | 
+0

產品可能不屬於公司? – Leo 2014-08-28 11:37:53

+0

Nop,產品總是屬於一家公司。 – mcanaves 2014-08-28 11:47:02

+0

在這種情況下,我會刪除關係產品附件 – Leo 2014-08-28 11:49:20

回答

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   | 
+---------------------+ 
  • COMPANIES
    • PK:COMPANY_ID
  • 產品
    • PK:PRODUCT_ID,COM​​PANY_ID
    • FK:COMPANY_ID參考COMPANIES COMPANY_ID
  • PRODUCT_BUNDLES
    • PK:parent_product_id,child_product_id,COMPANY_ID
    • FK:parent_product_id,COMPANY_ID內容的產品PRODUCT_ID,COM​​PANY_ID
    • FK:child_product_id,COMPANY_ID內容的產品PRODUCT_ID,COM​​PANY_ID
  • CLIENTS
    • PK:client_id
  • CLIENT_PRODUCTS
    • PK:CLIENT_ID,PRODUCT_ID,COM​​PANY_ID
    • FK:CLIENT_ID引用的客戶機CLIENT_ID
    • FK:PRODUCT_ID,COM​​PANY_ID內容的產品PRODUCT_ID,COM​​PANY_ID

的COMPANY_ID被包括作爲產品PK的一部分,這樣只有同一家公司的產品才能捆綁在一起。

產品表最初包括單個產品和單個附件。來自同一公司的個別產品和配件可能會捆綁在一起形成新的「產品」。這些新的「產品」可能會與個人產品或配件或其他捆綁捆綁在一起,形成更多的「產品」。

is_offerable標誌指示單個產品,配件或捆綁包是否可以與客戶端關聯。

您還可以通過在產品表上具有產品類型列來限制哪些產品與客戶端相關聯,並確保只有至少包含一種產品的產品或產品包與客戶端相關聯。

+0

好的,但是如果一個客戶只能將一個產品關聯到他的賬戶上,而沒有附件或者產品與一個或多個捆綁產品的關聯,那麼client_product表就不是必要的了? – mcanaves 2014-09-01 10:51:35

+0

CLIENT_PRODUCTS表是必要的,因爲客戶可以提供多個'產品',例如'產品1','具有附件A的產品1'和'具有附件A和B的產品1'以及一個產品可以由多個客戶提供。如果所有客戶只提供一種產品,或者所有產品只由一個客戶提供,那麼CLIENT_PRODUCTS表就不是必需的,這似乎並不是業務規則。 – DrabJay 2014-09-01 11:44:58