如何根据合同设计具有不同价格的产品数据库

时间:2016-12-03 00:47:35

标签: sql database database-design

标题非常含糊,所以我将在下面进一步解释:

背景:

  • 制造公司有广泛的产品,所有产品都有基价。

  • 公司与不同的买家有不同的合同

  • 每份合约都包含买家可以购买的产品清单折扣价。未在合同中列出的产品将以其基本价格购买。

简而言之,产品本身不会改变,但价格会根据合约而改变。请注意,折扣价格不是通过公式计算的 - 它们实际上是一组不同的价格。

我的产品表设置如下:

====================================
product_id | category_id | base_price|  
====================================
 1         |  1          | 300       | 
 2         |  3          | 200       | 
 3         |  5          | 500       | 

我对数据库设计还是比较陌生的,对于我的生活,我无法找到一种有效的方法来设计合同表,以便它可以改变它所包含的产品的价格。非常感谢任何帮助。

以下是我尝试的内容:

合同表

========================
contract_id | buyer_id |  
========================
 1          |  1        | 
 2          |  3        | 
 3          |  5        | 

Pricings表:

===============================================
pricing_id | price | product_id | contract_id |  
===============================================
 1         |  400    | 3        | 1           |
 2         |  230    | 2        | 2           |
 3         |  520    | 5        | 3           |

但是,由于合同中的每个产品都是此表中的唯一行,因此这种方法不会显着增加pricings表中的行数吗?因此,如果我有4个合同,那么行将是4 X (No. of products in the contract)

1 个答案:

答案 0 :(得分:1)

你的设计很好看。如果您对合同中的每个产品都有价格,那么您应该存储它。不重要的是桌子有多大或有多少桌子。如果您有合适的设计和索引,数据库可以处理此问题。

您的自然键设计:

Product         ( id (pk), ..., base_price )
Buyer           ( id (pk), ... )
Contract        ( id, id_buyer (fk1 to Buyer), ... )
Contract_Product( id_contract (pk, FK1 to contract), 
                  id_product (pk, FK2 to product), 
                  price, ... )

您的代理键设计:

Product         ( id (pk), ..., base_price )
Buyer           ( id (pk), ... )
Contract        ( id, id_buyer (fk1 to Buyer), ... )
Contract_Product( id (pk),
                  id_contract (unique1, FK1 to contract), 
                  id_product (unique1, FK2 to product), 
                  price, ... )