我有一张桌子订单。每个订单可以多次拥有相同的产品。 数量不够,因为每种产品可能有不同的偏好! 所以我想知道什么是更好的...
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;会很快还是会进行全表查找?
答案 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的要求,使用不同量的奶油和糖等咖啡。