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