GUID vs Identity用于标记

时间:2012-10-15 16:09:04

标签: sql-server-2008 tsql tags

我知道这个主题已经详细讨论了(我在这里和网上都阅读过很多帖子)而且我不喜欢鞭打死马,但我对整数ID的更具体方面有疑问vs GUID:

我正在编写一个架构,它具有与stackoverflow标签类似的标记功能,但它将使用与5个以上不同表格相同的标签。

我要链接的基本表格如下:

标记表

Tag ID    Tag Name      Tag Description
-------------------------------------------------------------
     1    Hats          Tag for hats
     2    Coats         Tag for coats
     3    Gloves        Gloves tag
     4    Ladies        Ladies item

项目表1

Item ID    Item Name    Cost
------------------------------------------------------------
      1    Deerstalker  £20.00
      2    Fedora       £50.00
      3    Scarf        £15.00

我遇到问题的是tag_item表。

我将拥有5个具有完全不同结构的表,我希望用户能够应用标签,所以我想我需要执行以下操作之一:

  • 存储table name / table number以及代码与
  • 相关的行的整数关键字
  • 存储该行的GUID,这将独立于表格工作,并使得获取特定行的所有标记变得更加容易。

我不确定这将如何影响以下方面的表现:

  • 使用特定标记/标记搜索超过5个表的所有项目
  • 编辑项目的标签
  • 加入

在这种情况下是否有明显更好的选择,或者我可以在任何地方阅读这一特定情况下的优势?


修改

对于任何有兴趣的人,下面是我决定的模式:

标签表

CREATE TABLE [dbo].[Sys_TagList](

    [Sys_Tag_Primary] [int] IDENTITY(1,1) NOT NULL,
    [Sys_Tag_Name] [varchar](50) NOT NULL,
    [Sys_Tag_Description] [varchar](1000) NULL

)

Tag_Items表

CREATE TABLE [dbo].[Meta_Tags](

    [Met_Tag_Primary] [int] IDENTITY(1,1) NOT NULL,
    [Met_Tag_Link_FK] [int] NOT NULL, -- Link to [Sys_Tag_Primary] field
    [Met_Tag_Name] [varchar](25) NOT NULL, -- To enable tag searches to use a single table
    [Met_Tag_Table] [varchar](25) NOT NULL, -- Table name, used with [Met_Tag_RowID] to create link to that item
    [Met_Tag_RowID] [int] NOT NULL -- Primary key of item[n] table

)

2 个答案:

答案 0 :(得分:9)

我要(可能没有帮助)建议GUID vs ID是一个错误的问题。假设您需要将标签链接到项目的单个表格,可能需要先进行检查。

如果您的五个项目类别不同,需要不同的表格,那么您应该考虑五个tag_item链接表 - 每个项目表一个。虽然一次查询所有内容的代码(使用UNION ALL来连接结果)可能比单个链接表的代码更冗长,更具有重复性,但查询可能要简单得多 - 两者都很好维护和查询计划的角度。

另一种选择是将五个项目类别共享的公共属性重构为单个中心表(标记链接到其中),并将其他非公共属性存储在五个子表中。如果没有关于当前如何使用现有数据的更多信息,很难知道这是否合适。

答案 1 :(得分:1)

可能的tagging design duplicate

根据您打算如何使用标记以及哪些性能特征很重要,地图/链接表的一种可能替代方法是散列组合表。

计算给定请求的标签组合的哈希值,并将其直接存储在现有表格和组合表中。

查询任何属于标签子集的东西可能会开始变得有点hacky,尽管你最终会在所有这些哈希中进行大量的内存转换。也许有一种更简洁的查询散列参考值的方法,因为我不记得这样做了,并没有立即在搜索中找到任何东西。