【问题标题】:Unique id shared between multiple tables sql 2008多个表sql 2008之间共享的唯一ID
【发布时间】:2012-03-28 13:43:59
【问题描述】:

我的网站有问题。该网站有多个实体:文章、帖子、评论……或 6 种类型。现在我介绍用户对项目进行评分的可能性(可以是这些实体中的任何一个)

我创建了一个表 Votes(int Id 主键,int ItemId,nvarchar(30) Ip,datetime Timestamp,int VoteValue)。在这里,我将存储所有投票及其 ip。

我的问题是我的 ItemID 必须是唯一的......但是我的数据库已经有各种类型的项目具有相同的 id。所有表的 id 都从 0 开始。您认为我的设计有哪些选项可以将所有投票存储在一个表中?

【问题讨论】:

  • 是否必须是唯一的 ID 列?难道你不能也有一个类型列(它标识它应该来自哪个表)并且它是一个唯一的组合?
  • 你是对的......但我在考虑是否要进行查询以获得项目的所有选票
  • 您是想将投票限制为每个项目一个,还是所有项目都是一种?
  • 我不明白为什么你不能简单地在你的表投票中添加一个 IDENTITY 列?我可能不明白你想要什么。你能澄清一下吗?

标签: sql-server asp.net-mvc-3 database-design database-schema


【解决方案1】:

您的方法是尝试为“ItemId”字段分配多种含义,这将导致您遇到的问题。如果我在那个字段中看到“9500”,我怎么知道那是什么意思?

我建议删除 ItemId 字段并在投票和其他实体之间创建“人行横道”表。

例如,您的实体:

+-----------+
| 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 引用,从而确保唯一性。

根据我的经验,这是您描述的领域的适当规范化方法。

在查询中,要获得文章的投票(例如),只需通过 ArticleVotes 对文章进行 INNER JOIN 即可投票。要获得所有投票,只需查询投票。

此外,我建议在您的 Votes 表中创建一个 IPAddresses 表并对其进行 FKing 以减少冗余。

【讨论】:

    【解决方案2】:

    没有提到的一个选项是 GUID。如果您在文章/帖子/评论/等中使用 GUID。而不是 int 主键,您可以依赖它们是唯一的。我并不是说这是您应该使用的路由,因为它会增加额外的开销来存储/搜索 GUID 而不是整数。

    我建议将 type 字段添加到 votes 表中,并将其作为键的一部分。听起来您已经考虑过这个想法,但担心性能。如果您担心性能,请在将更改投入生产之前进行一些测试以确保表查询满足您的需求。

    【讨论】:

      【解决方案3】:

      一种可能性是将您的一组不同的表转换为类型/子类型集。可以在here 找到对此的讨论。 (可能相当大的)缺点是您必须重构所有表……但是您将有一个 Id(可能是“ItemId?”)用于唯一地标识您的所有项目类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-09
        • 1970-01-01
        • 2011-02-02
        • 2014-11-06
        • 2012-07-22
        • 2014-08-09
        相关资源
        最近更新 更多