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