我正在尝试建立一个数据库关系来跟踪购买的物品,这些物品将用于事后查找——例如电子书。忽略省略号——它们代表杂项数据,例如时间戳等...
这是我现在的表:
purchased:
transaction_id(int)(pk)(auto_inc) | username (varchar) | purchases (text) | ...
在此设计中,“purchases”列只是一个文本字符串,其中包含已购买项目的 item_id,以逗号分隔。简化示例:“book1、book23、book5、book8”。
在一个成功的交易中,这个查询会将交易数据插入到“purchased”表中:
INSERT INTO purchased VALUES (null, username, purchases, ...)
从这一点开始,可能会发生两件事:
- 用户可以查找他们购买的电子书
- 用户可以进行另一次购买交易。
如果用户(用户名)想要查看他们的电子书,系统会执行选择查询,例如
SELECT purchases FROM purchased WHERE username=theusername
它返回一个包含项目 ID 的字符串。
一个旁注,是否有可能在不必使用额外的 php 代码(即爆炸)的情况下获得一个 php 数组购买?除了 SQL 中的数据类型“文本”之外,您可以使用其他东西来存储项目列表吗?如果没有,那也没关系。
无论哪种方式,这是主要问题。假设用户进行了另一笔交易——“purchased”中现在将有两行包含用户购买的商品。这意味着在这个表中,用户的购买被分成了多行。
理想情况下,我希望这些购买都在同一行。我不能使用 UPDATE 语句,因为每次购买都有自己唯一的 transaction_id。
我在想我可以制作另一个包含用户所有购买的表
all_purchased:
username (pk) | purchases (text) | ...
并且每当用户进行另一笔交易时,“all_purchased”表只会使用任何新电子书的项目 ID 更新其购买列。
但是这个表似乎是多余的,因为我提到的选择查询可以完成任务。
构建数据库关系的最佳方法是什么?