Database design 数据库设计问题

Database design 数据库设计问题,database-design,postgresql,Database Design,Postgresql,我有一张点菜的桌子。每个订单可以多次使用同一产品数量不够,因为每种产品可能有不同的偏好! 所以我想知道什么是更好的 主键id订单id产品id?主键是pkid 或 订单表 (订单id,订单行)作为主键 然后是另一张桌子 订单行 (订单id、订单行、产品id)作为主键 然后 订单行参考 (订单id、订单行、产品id、首选项id)作为主键 我想知道这种方法是否可行。而且我也不知道我应该做些什么来编制索引,以免记录太多时速度变慢。我正在使用postgresql.. 例如,在OrderLinesRefer

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

主键id订单id产品id?主键是pkid


订单表
(订单id,订单行)作为主键

然后是另一张桌子
订单行
(订单id、订单行、产品id)作为主键

然后
订单行参考
(订单id、订单行、产品id、首选项id)作为主键

我想知道这种方法是否可行。而且我也不知道我应该做些什么来编制索引,以免记录太多时速度变慢。我正在使用postgresql..

例如,在OrderLinesReferences表中,订单id=1,产品id=10;会很快还是会进行完整的表格查找?

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

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

您展示的两种设计(当我阅读它们时,您的符号有点混乱)都不是我所建议的。在
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

你展示的两种设计(当我阅读它们时,你的符号有点混乱)都不是我所建议的。在
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

以下是我脑海中的想法:

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


由于这似乎是一个新的实现,请记住以下几点:产品的价格通常会随着时间的推移而变化(客户地址、优惠券等也是如此),一旦您完成了发票,您将希望保留这方面的历史记录。这可以通过每次更改商品的任何详细信息时更改ProductKey来实现,或者您需要某种存档系统,其中包括与发票相关的所有历史详细信息。

以下是我脑海中的想法:

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


由于这似乎是一个新的实现,请记住以下几点:产品的价格通常会随着时间的推移而变化(客户地址、优惠券等也是如此),一旦您完成了发票,您将希望保留这方面的历史记录。这可以通过每次更改项目的任何详细信息时更改ProductKey来实现,或者您需要某种档案系统,其中包括与发票相关的所有历史详细信息。

根据@OP对dnuttle回答的评论,我认为情况需要项目和子项目,所有这些都来自基本项目列表

因此:


根据OP的要求,您可以多次订购同一商品,并对每一商品应用0个或多个选项,例如在咖啡中添加不同量的奶油和糖等。

根据@OP对dnuttle回答的评论,我认为情况需要商品和子商品,所有这些都来自基本项目列表

因此:

这为您提供了需要多次订购同一商品以及0或mo的订单