0

我有两张桌子:

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

如果每个项目只有一个接受的投标,选项 2 将是更好的方法。选项 1 将允许接受任何数量的投标。

关于推理的更多信息:accepted_bid_id选项 2 中的列不仅确保每个项目最多只能接受一个投标,还可以让您更快地访问该投标。如果您使用布尔值(您的选项 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 允许更简单的查询

所以没有太多指向选项1的方向。

于 2013-03-10T15:03:49.787 回答