【问题标题】:How to solve the loop problem in database relationships?如何解决数据库关系中的循环问题?
【发布时间】:2019-06-17 06:45:25
【问题描述】:

我有一个项目,用户可以在其中插入拍卖、投标和广告。他们还可以参与拍卖和招标。 我在设计和连接数据库和连接时遇到问题。 我的数据库中的关系中有循环。

我有六个表叫:

user(user_id,firstName,LastName,...)

Order(order_id,user_id,OrderName,Desc,Amount,OrderType,...)

Auction(auction_id,order_id,start_date,block_amount,min_increase,end_date,...)

Tender(tender_id,order_id,tender_base_amount,tender_start_date,tender_expire_date,...)

AuctionOffer(offer_auction_id,auction_id,user_id,auction_amount_offer,Date)

TenderOffer(tender_offer_id,tender_id,user_id,auction_amount_offer,Date)

我的关系:

你对解决这个问题有什么建议?

【问题讨论】:

    标签: sql database relationship


    【解决方案1】:

    我没有看到任何循环。所有外键都指向User

    CREATE TABLE [User] (
      [user_id] INT NOT NULL PRIMARY KEY,,
      [user_name] VARCHAR(50),
      [first_name] VARCHAR(50),
      [last_name] VARCHAR(50)
    );
    
    CREATE TABLE [Order] (
      [order_id] INT NOT NULL PRIMARY KEY,
      [user_id] INT REFERENCES [User] ( [user_id] )
      [order_name] VARCHAR(50)
    );
    
    CREATE TABLE [Auction] (
      [auction_id] INT NOT NULL PRIMARY KEY,
      [order_id] INT REFERENCES [Order] ( [order_id] )
      --,...
    );
    
    CREATE TABLE [AuctionOffer] (
      [offer_auction_id] INT NOT NULL PRIMARY KEY,
      [auction_id] INT REFERENCES [Auction] ( [auction_id] ),
      [user_id] INT REFERENCES [User] ( [user_id] )
      --,...
    );
    
    CREATE TABLE [Tender] (
      [tender_id] INT NOT NULL PRIMARY KEY,
      [order_id] INT REFERENCES [Order] ( [order_id] )
      --,...
    );
    
    CREATE TABLE [TenderOffer] (
      [tender_offer_id] INT NOT NULL PRIMARY KEY,
      [tender_id] INT REFERENCES [Tender] ( [tender_id] ),
      [user_id] INT REFERENCES [User] ( [user_id] )
      ---,...
    );
    

    必须先创建Users,然后再创建Orders。之后,TendersTenderOffersAuctionsAuctionOffers

    在查询中加入表:

    SELECT
        a.[auction_id],
        o.[order_id], o.[order_name], ou.[user_name] as [creator]
    FROM [Auction] a
    INNER JOIN [Order] o ON o.[order_id] = a.[order_id]
    INNER JOIN [User] ou ON ou.[user_id] = o.[user_id]
    ;
    
    SELECT
        aou.[user_name] as [bidder], ao.[created_date], ao.[auction_amount_offer]
    FROM [AuctionOffer] ao
    INNER JOIN [User] aou ON aou.[user_id] = ao.[user_id]
    WHERE ao.[auction_id] = ?
    ORDER BY ao.[Date] DESC
    ;
    

    或组合:

    SELECT
        a.[auction_id],
        o.[order_id], o.[order_name], ou.[user_name] AS [creator],
        aou.[user_name] AS [bidder], ao.[created_date], ao.[auction_amount_offer]
    FROM [Auction] a
    INNER JOIN [Order] o ON o.[order_id] = a.[order_id]
    INNER JOIN [User] ou ON ou.[user_id] = o.[user_id]
    LEFT JOIN [AuctionOffer] ao ON ao.[auction_id] = a.[auction_id] AND ao.[deleted_at] IS NULL
    LEFT JOIN [User] aou ON aou.[user_id] = ao.[user_id]
    ORDER BY a.[start_date], a.[start_time] a.[auction_id], ao.[created_at]
    

    请注意,[User] 有两个实例,但别名不同。还有两列用于[User].[user_name],但用于不同的表别名。

    【讨论】:

    • 我的查询有问题。例如,我想列出所有拍卖(包括 OrderName、UserName、UserFamily、Auction_id、Amount、min_increase)以及最后一个投标人的姓名和金额。所以我需要加入:订单、拍卖、用户、AuctionOffer。问题是我想要名称订单(插入广告的人)以及投标人的姓氏。在记录中。
    【解决方案2】:

    我同意 Markus 的观点,我看不到任何 M:M(多对多)关系,1 个用户可以有多个拍卖报价、投标报价和订单 (1:M),1 个订单可以有多个拍卖和投标 ( 1:M);并且 1 个拍卖或投标可以有多个拍卖要约或要约要约 (1:M)。 TenderOffers 和 AuctionOffers 表是您解决任何 M:M 关系的“联结表”。

    【讨论】:

      猜你喜欢
      • 2019-09-03
      • 2016-07-26
      • 1970-01-01
      • 2021-03-12
      • 2019-07-09
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      相关资源
      最近更新 更多