0

我的网站有问题。该网站有多个实体:文章,帖子,评论... orund 6种类型。现在我介绍用户评价一个项目的可能性(它可以是任何这些实体)多个表格之间共享的唯一ID sql 2008

我创建了一个表Votes(int Id主键,int ItemId,nvarchar(30)Ip,datetime Timestamp,int VoteValue)。在这里,我将存储所有选票和他们的ips。

我的问题是,我必须有ItemID唯一...但我的数据库已经有各种类型的项目具有相同的ID。所有表格都从0开始创建ID。您可以在我的设计中看到哪些选项,以便能够将所有选票存储在单个表格中?

+1

是否必须是唯一的ID列?难道你不能有一个类型的列(它标识了它应该来自哪个表),它是一个独特的组合吗? – Bridge 2012-03-28 13:46:16

+0

你是对的......但我一直在考虑对性能的影响,如果我会让查询获得一个项目的所有选票 – 2012-03-28 13:49:43

+0

你是想限制选票每个项目,或者是所有项目之一? – HABO 2012-03-28 14:09:14

回答

2

你的方法是试图给字段“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到您的投票表中,以减少冗余。

+0

+1,这是我在评论中提出的方法 – Bridge 2012-03-28 15:35:22

1

未提及的选项是GUID。如果您在文章/帖子/评论/等使用GUID。而不是你可以依靠这些唯一的int主键。我不是说这是你应该使用的路线,因为它可以增加额外的开销来存储/搜索GUID而不是整数。

我会建议在投票表中添加类型字段并使其成为密钥的一部分。这听起来像你已经想到这个想法,但担心表现。如果您担心性能需要进行一些测试,以确保表格查询在将更改投入生产之前满足您的需求。

0

一种可能性是将不同的表格集合转换为类型/子类型集合。对此的讨论可以在here找到。 (可能相当大)的缺点是,你必须重构所有的表格......但是,你会有一个Id(也许是“ItemId”)用来单独标识所有的项目类型。