8

我知道这个主题已经被详细讨论过(我在这里和整个网络上阅读了很多帖子)并且我不喜欢鞭打死马,但我有一个关于整数 ID 与 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

)
4

2 回答 2

9

我将(也许无济于事)建议 GUID 与 ID 是要关注的错误问题。您需要一个将标签链接到项目的表的假设可能值得首先检查。

如果您的五个项目类别差异到足以需要不同的表,那么您可能应该考虑五个 tag_item 链接表 - 每个项目表一个。尽管一次查询它们的代码(UNION ALL用于连接结果)可能比单个链接表的代码更冗长和重复,但查询可能要简单得多——无论是维护还是查询都很好-计划视角。

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

于 2013-05-29T11:29:08.297 回答
1

强制性可能的标记设计重复

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

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

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

于 2013-06-05T02:44:50.297 回答