如何为一对多的关系设计数据库模式?

3

我需要实现一个购物车,假设我正在销售20个不同的商品。

我有几个简单的表:

Cart
-------
tran_id    first_name    last_name    items
1          John          Doe          1:4:15:16


Item
-------
item_id    name         price
1          Ruby         $1.00
2          Diamond      $2.00
...

问题在于,我如何查询购物车并按照Ruby、紫水晶、蛋白石、银的顺序显示商品,而不是1:4:15:16格式。


2
听起来像是多对多关系。一个人可以购买多个物品,而一个物品也可以被多个人购买。 - Dan
1个回答

7
你的结构不是一对多或多对多,它只是一个一对“blob:of:colon:separated:text”关系。一个正确的多对多关系通常使用一个表来桥接这个关系。在你的情况下,那张桥接表通常是“交易明细”表,而你的“购物车”表则是“交易头”表。在这种情况下,你将会有三张表:
CART (transaction header)
---------------
tran_id NUMBER
first_name VARCHAR(100)
last_name VARCHAR(100)

CART_ITEM (transaction detail)
---------------
tran_id NUMBER
item_id NUMBER
.. other details about this line item (quantity, etc)

ITEM
---------------
item_id NUMBER
name  VARCHAR(100)
price  NUMBER(18,4)

然后,为了查询您要查找的内容,只需说:
SELECT h.tran_id, i.name, i.price
  FROM cart h 
INNER JOIN cart_item d ON (h.tran_id = d.tran_id)
INNER JOIN item i ON (d.item_id = i.item_id)
WHERE h.tran_id = 1
ORDER BY i.name

5
我愿意为一个“blob:of:colon:separated:text”注释支付+10000。在一个字段中存储多个值从来都不是一个好主意。 - HLGEM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接