【问题标题】:sql data model for an order with many products包含许多产品的订单的 sql 数据模型
【发布时间】:2021-06-28 10:11:23
【问题描述】:

我正在尝试为订单创建一个数据模型,在一个订单中,我可以拥有许多产品。到目前为止,我想出了这个模型:

这个想法是一个订单可以在 order_product 表中产生许多行(我有名称和价格属性,因为它们可能会在稍后更新,我想保留在创建订单时正确的值(而且我也缺少 PRODUCT_ID 外键,因为我真的不需要它。))。我的问题是:

  1. 这种方法正确吗?
  2. 如果方法正确,如何以这种方式管理插入 - 我首先为订单创建记录,然后使用我第一次创建的订单的 ID 将所有产品插入 order_product 表中,但是如何我得到了订单产品表所需的 ORDER_ID?

我对 SQL 真的很陌生,所以如果这个问题很愚蠢,请原谅。我真的很难找到正确的方法来做到这一点。提前致谢。

【问题讨论】:

  • 也许this 会回答你的问题。
  • 不是真的,因为我几乎可以肯定这种方法是正确的(一对多)。但是关于检索订单 ID 并在订单产品表中使用它的问题是我无法回答的问题。

标签: sql postgresql


【解决方案1】:

首先您使用returning 子句插入order

insert into order (date) values (current_date) returning id;

为了将返回值存储到变量中,例如。 my_var_id。然后你使用这个值来做这样的事情

insert into order_product(order_id, name, price, quantity) values
(:my_var_id, 'apples', '2.0', 5.20),
(:my_var_id, 'pears', '2.5', 3.75),
(:my_var_id, 'fish', '20.0', 1.38);

有多种方法可以做到这一点,包括。来自上层的 CTE、plpgsql 块/函数或数据库调用。

顺便说一句,您的案例是多对多关系的教科书示例。问题是 order_product 未能通过 2NF 并更好地进行规范化 - 而不是名称和价格有 product_id,FK 到 product 表。

【讨论】:

  • 在现实世界中,您经常需要(重复)订单行上的名称和价格(除了 product_id) - 您可以将它们称为 modified_product_name_for_current_order 和 special_price_at_order_creating_time 或类似的名称:)
  • @Arvo 很公平,order_product 仍然是一个桥牌桌。
  • @Arvo 是的,这是我的想法,这就是我复制它们的原因。
  • @Stefanov.sm 我会检查您的解决方案,不知道您插入时是否有返回选项。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 2022-01-27
  • 1970-01-01
相关资源
最近更新 更多