php - 购买元素的数据库关系

标签 php mysql sql database database-design

我正在尝试建立一个数据库关系来跟踪已购买的元素,这些元素将用于日后查找——例如电子书。忽略省略号——它们代表杂项数据,例如时间戳等...

这是我现在的 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, ...)

从这一点开始,可能会发生两件事:

  1. 用户可以查询他们购买了哪些电子书
  2. 用户可以进行另一笔购买交易。

如果用户(用户名)想要查看他们的电子书,系统会执行一个选择查询,例如

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 列与其各自表的外键关系,即 purchasedbooks

希望您的其余问题将通过使用这个新表得到解决。

关于php - 购买元素的数据库关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13216196/

相关文章:

php - 修改 mod_mainmenu 以获取菜单项上的悬停文本

PHP 登录无法按预期工作

php - php中按权重从数组中随机取值

mysql - 查询优化 CASE 与 UNION

PHP Form 不向 mySQL 数据库添加数据?

php - MySQL - null = 0 的问题

php - 连接两个表以显示数据

mysql - 查询 MySQL 表中用户还没有的项目 'scored'

MySQL View 将INT列的SUM转换为小数类型

php - 我的 php 不解释 postgresql 或 sql 函数