0

私は2つのテーブルを持っています:

items              bids
 -id (pk)          -id (pk)
 -user_id (fk)     -user_id (fk) references users (pk)
 -title            -item_id (fk) references items
                   -bid_price

また、ユーザーが入札を受け入れるオプションも必要です。この機能を使用するには、データベースをどのように構成すればよいですか。

オプション1:

bids 
-id (pk)
-user_id
-item_id
-bid_price
-is_accepted

オプション 2:

items
-id
....
-accepted_bid_id (fk references bid)

どのオプションを選択するか、他のオプションを提案する必要がありますか?

4

1 に答える 1

3

アイテムごとに受け入れられた入札が 1 つしかない場合は、オプション 2 の方が適しています。オプション 1 では、任意の金額の入札を受け入れることができます。

理由についてもう少し詳しく説明しaccepted_bid_idます。オプション 2 の列は、アイテムごとに受け入れられる入札が最大 1 つだけであることを保証するだけでなく、その入札にすばやくアクセスできるようにもします。ブール値を使用した場合 (オプション 1)、受け入れられた入札に参加するには、次のようにする必要があります。

SELECT * FROM items
LEFT JOIN bids ON bids.item_id=items.id AND bids.is_accepted

これには、入札の複合インデックス (item_id,is_accepted) が適度に高速である必要があります。一方、オプション 2 を使用すると、次のことができます。

SELECT * FROM items
LEFT JOIN bids ON bids.id = items.accepted_bid_id

これには、すでに持っている 2 つの主キー以外のインデックスは必要ありません。

要約すると:

  • オプション 2 は整合性を維持します
  • オプション 2 では、追加のインデックスは必要ありません
  • オプション 2 では、より単純なクエリが可能です

したがって、オプション 1 の方向性を示すものはあまりありません。

于 2013-03-10T15:03:49.787 に答える