1

那里有很多关于标签模式的讨论,但我注意到其中大部分都集中在单一的内容类型上,例如书签或照片。

我有兴趣在多租户业务应用程序的多个功能中使用标签;一种标签可以与表单字段、文档、照片、配置设置等相关的标签。

我想设计一组较小的表来满足这些不同的需求,而不是为每种内容类型删除链接表,这会增加一些复杂性:

tags {
  tagsID
  tagName
}
tagChildren {
  childID
  childValue
}
tagType {
  typeID
  typeName
}
entity {
  entityID
  entityName
  ... 
}
tagMap {
  mapID  
  tagsID (FK)
  childID (FK)
  typeID (FK)
  entityID (FK)
}

tagMap 可用于连接任意数量的这些项目,但至少会连接标签和 tagType。例如,标签可能与下拉字段类型相关联。它可以是具有注册表类型、子值并与实体相关联的注册表项。一个标签子可能是另一个标签,以允许多级父子关系。

分发存在风险,因为许多功能变得依赖于一小组表。

如果您受到类似决定的挑战,或者您有一个有用的想法,请分享您的想法、方法以及绩效与分销风险的关系。

谢谢!

4

2 回答 2

1

所以 Mark 有一个很好的观点,但是假设我们想要避免多个标签表,以及标签本身的固有冗余。我们可以:

**Create a single Tags Table:**
  Tags { TagsID, TenantID, Name, CreatorID }    

**Documents:**
  TagMap_Documents { TagMap_DocumentsID, DocID, TagID }
  Documents { DocID, Location/Blob, ... }

**Photos:**
  TagMap_Photos { TagMap_PhotosID, PhotoID, TagID }
  Photos { PhotoID, URL, PhotoBlob ... }      

现在我们引入了一个新问题——标签表是非规范化的。在 Mark 的场景和我自己的场景中,在这里,我们介绍了为每个租户和创建者生成多个标签名称,或生成重载的租户和创建者字段(单个记录中的多个 ID)。

为了解决这个问题,我们可以:

  • 将实体和用户上下文转移到 TagMap 表,并连接到三个以上的表。我认为这会比我在最初的帖子中提出的更有效,因为我们已经分发了内容。

    创建单个标签表: 标签 { TagsID, Name }

    利用租户和用户表 Tenant { TenantID, Name, ... } Users { UserID, Name, ... }

    文档: TagMap_Documents { TagMap_DocumentsID, DocID, TagID, TenantID, CreatorID } 文档 { DocID, Location/Blob, private(bit), ... }

    照片: TagMap_Photos { TagMap_PhotosID, PhotoID, TagID, TenantID, CreatorID } 照片 { PhotoID, URL, PhotoBlob, private(bit), ... }

  • 将实体和用户上下文转移到内容表(文档、照片)。这里的问题是标签本身不是实体或用户特定的,这会在自动完成/建议中产生噪音。

    创建单个标签表: 标签 { TagsID, Name }

    文档: TagMap_Documents { TagMap_DocumentsID, DocID, TagID } Documents { DocID, Location/Blob, TenantID, CreatorID, private(bit), ... }

    照片: TagMap_Photos { TagMap_PhotosID, PhotoID, TagID } 照片 { PhotoID, URL, PhotoBlob, TenantID, CreatorID, private(bit), ... }

在这里寻找灵丹妙药,可能需要比整个狩猎更多的思考;)如果不是,那么我们就不会有任何乐趣,无论如何:)

于 2009-08-21T20:39:03.043 回答
0

我不相信更少的桌子会让事情变得更有效率。为每种内容类型设置单独的表格不是更好吗?它会更具可读性。获得计数的查询也会因为更少的 JOIN 等而变得更容易和更有效?

例如:

对于文档:

DocumentTags { ID TenantID 名称 CreatorID }

DocumentMappedTags {ID DocumentID DocumentTagID }

照片:

PhotoTags { ID TenantID 名称 CreatorID }

PhotoMappedTags {ID PhotoID PhotoTagID }

于 2009-08-20T22:09:06.897 回答