有什么不同的方式存储订单物料和可以包含子物料的物料?

时间:2019-03-19 12:56:39

标签: mysql sql database-design relational-database

应用程序有订单,一个订单可以有项目。 为此,我们拥有如下数据库表。

Table 1 - T_ORDER(pk_order_id, order_no, date)
Table 2 - T_ORDER_ITEM (pk_order_itemid, fk_order_id, ean, quantity, price)

现在,我们必须支持订单可以包含捆绑商品的情况,这意味着一个捆绑商品包含多个真实商品。捆绑商品将具有普通商品可以具有的所有属性,如ean,数量,价格。

基本上,捆绑销售商品是一个或多个真实商品的虚拟组合,但它可以具有像真实商品一样的属性,例如数量-因此用户可以下单多个这样的捆绑商品,用于识别,价格-它可以包含所有商品的价格捆绑商品中的真实商品。

我想知道最好的数据库表设计来支持这种情况吗?以及彼此之间的优缺点是什么?在选择其中之一时应该考虑哪些方面?

Option 1 - New tables for bundle and bundle item
           In addition of above two tables , we add two new tables like
           T_ORDER_BUNDLE(pk_order_bundle_id, fk_order_id, ean, quantity, price
           T_ORDER_BUNDLE_ITEM (pk_order_bundle_itemid, fk_order_bundle_id, ean, quantity, price) 

Option 2 - New table to store bundle and use existing table for item
           T_ORDER_BUNDLE(pk_order_bundle_id, fk_order_id, ean, quantity, price
           Just add new column like fk_order_bundle_id in T_ORDER_ITEM table.

Option 3 - New table to store sub items of an item 
           Bundle item can be stored in existing T_ORDER_ITEM table.
           New table - T_ORDER_ITEM_SUBITEM(pk_order_item_subitem, fk_order_itemid, ean, quantity, price)

注意:- 我们没有任何项目的主表。表T_ORDER_ITEM包含所有项目数据以及与订单的关系。由于可以接受任何商品的订单,因此我们没有固定的商品清单。

1 个答案:

答案 0 :(得分:0)

您要处理的是物品束,例如,束是一个网球拍套装,它由三个物品组成:两个球拍和一个球。您已经考虑了三种在数据库中建模的方法。我正在提出第四种方法。

到目前为止,您拥有什么:

  • 商品(item_id,ean,描述,标价)
  • 订单(order_id,order_no,日期)
  • order_item(order_item_id,order_id,item_id,数量,价格)

这是项目表的外观:

item_id | ean     | description      | list_price
--------+---------+------------------+-----------
1       | 1234567 | tennis racket    |      50.00
2       | 2345678 | tennis ball      |       4.00

现在我们需要做两件事:网球套装的捆绑商品以及该套装属于该套装的分配。

首先,将捆绑商品添加到商品表中:

item_id | ean     | description      | list_price
--------+---------+------------------+-----------
1       | 1234567 | tennis racket    |      50.00
2       | 2345678 | tennis ball      |       4.00
3       | 3456789 | tennis set       |      98.00

集合价格98比集合内容50 + 50 + 4 = 104的总和便宜,这通常是购买集合的原因。

现在,对于关联,我们创建关联表,我们可以调用bundles或类似名称。它显示了哪个项目包含哪些其他项目以及其中有多少。

  • 捆绑(bundle_item_id,bundled_item_id,金额)

然后用我们的数据填充它:

bundle_item_id | bundled_item_id | amount
---------------+-----------------+-------
3              | 1               |      2
3              | 2               |      1