我正在用PHP/MySQL开发一个股票订购系统。产品可以有多个供应商。通过指定所需数量和供应商,将产品添加到篮子中。这是当前的DB结构:
Products
=========
id (PK)
name
etc...
Suppliers
==========
id (PK)
name
etc...
Product_Suppliers
=================
id (PK)
product_id (PK)
supplier_id (PK)
price
Basket
=======
product_id (PK)
quantity
product_suppliers_id
Product_Suppliers表存储每种产品的不同供应商及其价格。
当将产品添加到篮子中时,它首先检查product_id是否已经存在于篮子表中-如果已经存在,则它将简单地覆盖记录。如果它不存在,那么它将创建一个新记录。
篮子表格中的product_suppliers_id字段指定为该特定产品选择了哪个供应商。
我想知道我在这里是否得到了正确的方法,或者我是否需要进行任何更改来消除任何冗余。
发布于 2011-08-24 20:11:54
在Basket
中,您应该具有:
basket_id (PK)
product_id
supplier_id
quantity
price
Product_Suppliers
只是一个配置表。它具有供应商提供的产品的唯一当前配置。你的Basket
应该比指向Product_Suppliers
“更了解”,因为:
你的设计应该允许你正确地查询历史数据,即使产品改变了价格,或者供应商不再提供它。
因此,您不应该在其中包含product_suppliers_id
。
而且,我在你的设计中看不到谁的篮子,这意味着你还应该有一个供客户或用户使用的表(或者两者,如果用户可以输入他们自己的订单,商店内部用户可以为客户输入订单)和相应的键(client_id,user_id)。
发布于 2011-08-24 20:10:15
在Basket
表中,product_id
似乎是多余的。此外,我可能会创建一个跟踪不同价格的表(当然,如果价格随着时间的推移而变化)。所以我会有:
Product_Suppliers上的
Product_Suppliers (id (PK), product_id (FK to Products), supplier_id (FK to suppliers), active(flag), UNIQUE constraint on (product_id + supplier_id))
Product_Suppliers_Versions (id PK, product_suppliers_id(FK to Product_Suppliers), price, effective_date)
Basket (id PK, prodcut_supplier_version_id(FK to Product_Suppliers_Versions), quantity)
AFTER UPDATE, INSERT TRIGGER
将以前的版本复制到Product_Suppliers_Versions),如果至少有一个购买绑定到supplier_id and product_id
,则阻止对它进行修改。发布于 2011-08-24 20:33:23
这还远不是最终的结果,而只是指向某个方向。
一个Basket
可能有很多项,所以引入了BasketItem
。
BasketItemNo
是序数(1,2,3 .)对于每个BasketID
。
将ItemPrice
复制到BasketItem.UnitPrice
,以便将来进行价格更改。任何价格变化都不应改变历史篮子数据。
如果ProductDescription
也可能发生变化,那么也应该在购买时进行复制。
https://stackoverflow.com/questions/7181580
复制