1

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

这是我现在的表:

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, ...)

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

  1. 用户可以查找他们购买的电子书
  2. 用户可以进行另一次购买交易。

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

SELECT purchases FROM purchased WHERE username=theusername

它返回一个包含项目 ID 的字符串。

一个旁注,是否有可能在不必使用额外的 php 代码(即爆炸)的情况下获得一个 php 数组购买?除了 SQL 中的数据类型“文本”之外,您可以使用其他东西来存储项目列表吗?如果没有,那也没关系。


无论哪种方式,这是主要问题。假设用户进行了另一笔交易——“purchased”中现在将有两行包含用户购买的商品。这意味着在这个表中,用户的购买被分成了多行。

理想情况下,我希望这些购买都在同一行。我不能使用 UPDATE 语句,因为每次购买都有自己唯一的 transaction_id。

我在想我可以制作另一个包含用户所有购买的表

all_purchased:
username (pk) | purchases (text) | ...

并且每当用户进行另一笔交易时,“all_purchased”表只会使用任何新电子书的项目 ID 更新其购买列。

但是这个表似乎是多余的,因为我提到的选择查询可以完成任务。

构建数据库关系的最佳方法是什么?

4

2 回答 2

1

我认为将购买的 book_ids 与逗号分隔值保持在同一行中并不是一个好主意。最好将新表定义为:

  purchased_books:
      transaction_book_id(int)(pk)(auto_inc) | transaction_id(int) | book_id(int)

还要定义 transaction_id 和 book_id 列与其各自的表的外键关系 iepurchasedbooks.

希望您的其他问题将通过使用这个新表来解决。

于 2012-11-04T05:06:20.393 回答
0

考虑到您使用的是关系数据库——有什么特殊原因不使用规范化表吗?这只是一种可能性。

在此处输入图像描述

这个传播密钥;如果您有某种类型的 ORM 对复合键有问题,请按此示例进行修改。

于 2012-11-04T13:47:47.420 回答