【问题标题】:Database relation of purchased items采购项目的数据库关系
【发布时间】:2012-11-04 05:00:02
【问题描述】:

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

这是我现在的桌子:

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 更新其购买列。

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

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

【问题讨论】:

    标签: php mysql sql database database-design


    【解决方案1】:

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

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

    同时定义 transaction_id 和 book_id 列与其各自表的外键关系,即 purchasedbooks

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

    【讨论】:

    • 我明白了。使用另一个表来维护购买的书籍而不是将书籍保存为用逗号分隔的字符串的主要好处是什么?例如,如果用户购买了 10 本书,那么使用之前的关系插入一行不是比使用新表插入 10 行更优化吗?
    • @Yau:我不知道你为什么认为保持逗号分隔值更理想。可能是您在计算行数和表数。如果是这样,那不是最佳选择。这样做会使数据组织、数据检索和操作等变得非常复杂。举个例子,如果一本书被退回,你想从列表中删除,或者你想检索一本特定的书,或者你想计算有多少买家购买了哪本书,所有这些查询都会很复杂,如果不是不可能的话.数据库系统可让您的数据组织简单且易于维护。
    【解决方案2】:

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

    这个传播密钥;如果您的 ORM 存在复合键问题,请修改 as in this example

    【讨论】:

    • 感谢您提供的图表。它清楚地说明了传播外键如何消除数据冗余。
    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多