数据库设计问题

时间:2011-09-04 15:57:56

标签: database-design postgresql

我有一张桌子订单。每个订单可以多次拥有相同的产品。 数量不够,因为每种产品可能有不同的偏好! 所以我想知道什么是更好的...

PK-id订单ID产品ID?主键是PK-id


订单表
(订单ID,订单行)为PK ..

然后是另一张桌子 的 Orderlines
(订单ID,订单行,产品)作为PK

然后是 的 OrderLinesPreferences
(Order-id,orderline,productid,preferenceid)为PK?

我想知道这种方法是否合适。我也不知道我应该怎么做索引,以便在记录很多时不会变慢。我正在使用postgresql ..
 例如,在OrderLinesPreferences表中,order-id = 1,productid = 10;会很快还是会进行全表查找?

4 个答案:

答案 0 :(得分:1)

“每种产品可能有不同的偏好”并不清楚你的意思。这是否意味着订单中的每一行可能对同一产品有不同的变化?所以你可能会买一件产品,一件衬衫,比如说,尺寸大,另一件是中等尺寸?在这种情况下,这听起来像产品与SKU对我来说。如果是这种情况,您需要一个链接到产品表的“子产品”或“SKU”表。然后您订单中的行将链接到SKU,而不是产品。可以将两者链接到订单行,但不是必需的。

答案 1 :(得分:1)

你所展示的任何一个设计(当我读它们时,你的符号有点令人困惑)都是我所建议的。在OrderID, ProductID未唯一标识订单商品的情况下(如果在给定订单上可以多次订购相同产品的情况),则通常的做法是在详细信息表中采用代理键。例如,架构看起来像:

Order (note here that table names, by convention, are in singular form)
----------
OrderID
CustomerID
...
etc.
PK is OrderID

OrderItem
-----------
OrderID
ItemNumber
ProductID
Quantity
...
etc.
PK is OrderID, ItemNumber

ItemNumber将是一个按顺序编号的字段,从每个OrderID重新开始。

至于如何存储您的偏好,您没有提供足够的信息来充分回答。如果每个订单商品只有一个“首选项”,那么您只需将其包含在OrderItem表中即可。如果每个订单商品可能具有可变数量的首选项,那么您需要以下内容:

OrderItemPreference
------------
OrderID
ItemNumber
... preference information
PK is OrderID, ItemNumber, and something to uniquely identify the preference

答案 2 :(得分:1)

这就是我的想法:

| OrderId | ProductKey | ProductPrefKey | Qty |

如果您必须按特定顺序出示发票,则需要添加行标识符,否则您可以忽略它。您可以将主键设为OrderId,ProductKey,ProductPrefKey,这样可以按订单快速访问。

由于这似乎是一个新的实施,请记住以下内容:产品价格通常会随着时间的推移而变化(客户地址,优惠券等),一旦您完成发票,您就会想要保留这是一个历史记录。这可以通过每次更改有关项目的任何细节时更改ProductKey来完成,或者您需要某种存档系统,其中包含与发票相关的所有历史详细信息。

答案 3 :(得分:1)

基于@OP对dnuttle的答案所作的评论,我会说情况需要项目和子项目,所有这些都来自基本项目列表。

所以:

PRODUCT
  product_id PK
, description
, ...

OPTIONAL_ITEM
  option_id PK
, description
, ...

ORDER
  order_id PK
, date_taken...

ORDER_ITEM
  order_id PK, FK
, item_number PK     // Or use a surrogate as PK, if you like
, product_id FK
, quantity

ORDER_ITEM_OPTION
  order_id PK, FK
, item_number, PK, FK  // Order and item FK to ORDER_ITEM
, option_id, PK, FK    // FK to OPTIONAL_ITEM
, quantity

根据OP的要求,这可以为您提供多次使用相同商品的订单以及每种商品应用0或更多选项所需的条件,例如根据OP的要求,使用不同量的奶油和糖等咖啡。