你的方法是试图给字段“ItemId”分配多个含义,这会导致你遇到的问题。如果我在该领域看到“9500”,我怎么知道这意味着什么?
我会建议删除ItemId字段并在投票和其他实体之间创建“crosswalk”表。
例如,你的实体:
+-----------+
| Articles |
+-----------+
| ArticleId | PK
| ~ snip ~ |
+-----------+
+-----------+
| Posts |
+-----------+
| PostId | PK
| ~ snip ~ |
+-----------+
...等等....
您的投票表:
+-----------+
| Votes |
+-----------+
| VoteId | PK
| ~ snip ~ |
+-----------+
你的 “人行横道” 表:
+--------------+
| ArticleVotes |
+--------------+
| ArticleId | PK, FK to Articles
| VoteId | PK, FK to Votes
+--------------+
+--------------+
| PostVotes |
+--------------+
| PostId | PK, FK to Posts
| VoteId | PK, FK to Votes
+--------------+
请注意,在你的人行横道表中,您可以创建一个组合主键,该主键包含对相应实体的FK引用,从而确保唯一性。
根据我的经验,这是一个适合您描述的域的标准化方法。
在查询中,获得文章的投票(例如)只需INNER JOIN文章通过ArticleVotes投票。要获得所有投票,只需查询投票。
此外,我建议创建一个IPAddresses表和FKing到您的投票表中,以减少冗余。
是否必须是唯一的ID列?难道你不能有一个类型的列(它标识了它应该来自哪个表),它是一个独特的组合吗? – Bridge 2012-03-28 13:46:16
你是对的......但我一直在考虑对性能的影响,如果我会让查询获得一个项目的所有选票 – 2012-03-28 13:49:43
你是想限制选票每个项目,或者是所有项目之一? – HABO 2012-03-28 14:09:14