【问题标题】:Stuck at many-to-many relationship in mysql database卡在mysql数据库中的多对多关系
【发布时间】:2014-01-10 04:51:41
【问题描述】:

我正在做一个简单的购物应用程序作为我的项目。我被困在维持多对多的关系。

我必须将用户事务的所有详细信息存储在一些具有关系的表中。以下是一些重要的列。

User_Id -- Foreign key from user table
Associated_Product_Id -- Foreign key from product table
Associated_Product_Quantity -- Not Null

为了更简单

user1         product1         5 pieces
user1         product2         2 pieces
user1         product3         1 piece
user2         product1         2 pieces
user2         product3         3 pieces

这里一个用户可以购买很多产品,一个产品可以被多个用户购买。所以我很困惑,如何管理这张桌子。我的意思是哪个是主键。

我将在多少张表中管理这些信息并不重要。但我需要管理这些信息。任何人都可以就管理这个问题给出一个粗略的想法。这样我就可以朝着这个方向努力。

谢谢。

【问题讨论】:

  • 您的表格设置正确,假设您需要存储购买物品时支付的价格(否则,金额将在product 表格中)。你需要什么帮助?正如您所拥有的,当User_Id 购买Associated_Product_id 时,您将创建一个包含购买数量和支付价格的行。
  • @MichaelBerkowski 金额仅在产品表中。你能帮我设置事务表及其与用户和产品表的关系吗?请参阅我更新的问题以获得更清晰的信息。

标签: mysql database many-to-many


【解决方案1】:

由于您将购物应用程序作为一个项目进行,因此您可能需要考虑将第四个表添加到您的架构中,以保存订单。

您的表格可能看起来像:

Users
-----
UserID (PK)
... (Other user details)

Product
-------
ProductID (PK)
... (Other product details)

Order
-----
OrderID (PK)
UserID (FK)
OrderDate

OrderLine
---------
OrderID (PK)
ProductID (PK)
OrderQuantity

这将使您能够查看用户在任何给定日期购买了多少件产品,而不仅仅是该用户曾经购买过多少件。

【讨论】:

  • 在 OrderLine 表中,OrderID 是 Order 表中的外键,ProductID 是 Product 表中的外键吗?请确认。
  • 在如图所示的OrderLine 表中,该表的主键是OrderID 和ProductID 组成的复合键。 (或者,您可以将单独的 OrderLineNumber 作为主键的一部分,并将 ProductID 作为外键;但是,这会更复杂。)
  • 是的,我知道 OrderID 和 ProductID 都是 OrderLine 表的复合 PK,但我的问题是这两列是否会从 Order 和 Product 表中引用。
  • @ChandraSekhar:我无法理解你最后的评论。为了回答我认为您提出的问题,OrderLine.OrderID 链接到 Order.OrderID,而 OrderLine.ProductID 链接到 Product.ProductID。
【解决方案2】:

对于交易,您只需要 1 个表 - 就像您刚刚发布的一样。

如果您需要知道某个用户购买了哪些产品,您可以在该表中查询User_Id,如果您需要知道某个产品是由哪些用户购买的,您可以在该表中查询Associated_Product_Id。 (我假设您已经有了产品和用户表,因为您在这里引用了 ID。)

您当然应该添加一列Transaction_Id 或类似的东西,以唯一标识交易。

【讨论】:

  • 但是我将如何管理该表中的 Transaction_Id?例如。 Transaction1-user1-这里我将如何编写用户购买的产品集。由于 MySQL 不支持 Array。
  • 我不确定我是否理解你的问题。如果要列出具有特定 User_Id(例如 1234)的用户购买的所有产品,请使用 SELECT Associated_Product_Id FROM Transactions WHERE User_Id = 1234; 查询它,这将返回一组产品 ID。 (我在这里假设您的交易表称为“交易”。)
【解决方案3】:

您需要三个表:

1) 用户表 2) 产品表 3) 交易表

用户 1:m 交易 交易1:m产品

交易需要密钥来链接用户和产品

【讨论】:

    【解决方案4】:

    MySQL 不允许您仅在两个表中使用多对多关系。您必须为要关联的两个表创建第三个表。

    第三个表将只包含产品和用户的外键(加上每笔交易的 ID)。

    一个简单的例子是:

    CREATE TABLE Product_User (
        trans_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
        product_id INT NOT NULL, 
        user_id INT NOT NULL, 
        FOREIGN KEY (product_id) REFERENCES Product_table (productid), 
        FOREIGN KEY (user_id) REFERENCES User_table (userid)
    );
    

    为表和 id 字段提供相应的名称。

    【讨论】:

    • 你完全明白我的意思。你能建议吗,怎么做?因为在Oracle中我可以轻松管理它。但是在Mysql中我完全糊涂了。
    • 我刚刚在我的答案中添加了一个示例 SQL 查询。看看;)
    • 上述代码示例将创建一个名为Product_table 的表,其中包含trans_idproduct_iduser_id 三个字段。 product_id 将是 Product 表中相关 id 的外键,user_id 将是 User 表中的一个外键。如果你完全不熟悉 MySQL ;)
    猜你喜欢
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多