招标网站的数据库结构

时间:2013-03-10 15:01:45

标签: sql database database-design

我有两张桌子:

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)

我应该选择哪个选项或建议其他选项?

1 个答案:

答案 0 :(得分:3)

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

有关推理的更多信息:选项2中的accepted_bid_id列不仅可以确保每个项目最多只有一个可接受的出价,还可以让您更快地访问该出价。如果您使用布尔值(您的选项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的方向上没有多少要点。