购买物品的数据库关系

时间:2012-11-04 05:00:03

标签: php mysql sql database database-design

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

这是我现在的表格:

purchased:
transaction_id(int)(pk)(auto_inc) | username (varchar) | purchases (text) | ...

在此设计中,“购买”列只是一个文本字符串,其中包含所购商品的item_id,以逗号分隔。简化示例:“book1,book23,book5,book8”。

在成功的交易中,此查询会将交易数据插入“已购买”表格中:

INSERT INTO purchased VALUES (null, username, purchases, ...)

从现在开始,可能会发生两件事:

  1. 用户可以查看他们购买的电子书
  2. 用户可以进行另一次购买交易。
  3. 如果用户(用户名)想要查看他们的电子书,系统会执行选择查询,例如

    SELECT purchases FROM purchased WHERE username=theusername
    

    返回包含项ID的字符串。

    一个不支持,是否有可能获得一个PHP数组购买而无需使用额外的PHP代码,即爆炸? 您可以使用SQL中数据类型“text”以外的内容来存储项目列表吗?如果没有,那没关系。


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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

还定义transaction_id和book_id列的外键关系及其各自的表,即purchasedbooks

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

答案 1 :(得分:0)

考虑到您正在使用关系数据库 - 有没有特殊原因不使用规范化表?这只是一种可能性。

enter image description here

这个传播密钥;如果您的某种ORM在使用复合键时遇到问题,请修改 as in this example