标题非常含糊,所以我将在下面进一步解释:
背景:
制造公司有广泛的产品,所有产品都有基价。
公司与不同的买家有不同的合同。
每份合约都包含买家可以购买的产品清单和折扣价。未在合同中列出的产品将以其基本价格购买。
简而言之,产品本身不会改变,但价格会根据合约而改变。请注意,折扣价格不是通过公式计算的 - 它们实际上是一组不同的价格。
我的产品表设置如下:
====================================
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)
?
答案 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, ... )