Database 多租户标记模式';用于分布式内容类型的

Database 多租户标记模式';用于分布式内容类型的,database,database-design,schema,tags,tagging,Database,Database Design,Schema,Tags,Tagging,关于标记模式,有很多讨论,但我注意到大多数讨论都集中在单一的内容类型上,比如书签或照片 我对跨多租户业务应用程序的多个功能使用标记感兴趣;其中标记可以与表单字段、文档、照片、配置设置等相关 我想设计一组更小的表,可以扩展到这些不同的需求,而不是为每种内容类型删除链接表,这增加了一些复杂性: tags { tagsID tagName } tagChildren { childID childValue } tagType { typeID typeName } entit

关于标记模式,有很多讨论,但我注意到大多数讨论都集中在单一的内容类型上,比如书签或照片

我对跨多租户业务应用程序的多个功能使用标记感兴趣;其中标记可以与表单字段、文档、照片、配置设置等相关

我想设计一组更小的表,可以扩展到这些不同的需求,而不是为每种内容类型删除链接表,这增加了一些复杂性:

tags {
  tagsID
  tagName
}
tagChildren {
  childID
  childValue
}
tagType {
  typeID
  typeName
}
entity {
  entityID
  entityName
  ... 
}
tagMap {
  mapID  
  tagsID (FK)
  childID (FK)
  typeID (FK)
  entityID (FK)
}
tagMap可用于连接任意数量的这些项目,但至少会连接标记和tagType。例如,标记可能与下拉字段类型相关联。它可能是具有注册表类型、子值的注册表项,并且与实体关联。标记子级可以是另一个标记,以允许多级父子关系

分布存在风险,因为许多特性依赖于一小部分表

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


谢谢

我不相信减少桌子会使事情更有效率。为每种内容类型单独设置表不是更好吗。它将更具可读性。查询以获取计数也会更容易、更高效,因为连接更少等等

例如:

对于文档:

DocumentTags{ID租户名称创建者ID}

DocumentMappedTags{ID DocumentID DocumentTagID}

对于照片:

照片标签{ID租户名称创建者ID}


PhotoMappedTags{ID PhotoID PhotoTagID}

我不相信减少表格会提高效率。为每种内容类型单独设置表不是更好吗。它将更具可读性。查询以获取计数也会更容易、更高效,因为连接更少等等

例如:

对于文档:

DocumentTags{ID租户名称创建者ID}

DocumentMappedTags{ID DocumentID DocumentTagID}

对于照片:

照片标签{ID租户名称创建者ID}


PhotoMappedTags{ID PhotoID PhotoTagID}

因此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}

    利用租户和用户表 租户{TenantID,Name,…} 用户{UserID,Name,…}

    文档: TagMap_文档{TagMap_文档SID、DocID、TagID、TenantID、CreatorID} 文档{DocID,Location/Blob,private(bit),…}

    照片: TagMap_照片{TagMap_照片ID,照片ID,TagID,租户,创建者} 照片{PhotoID,URL,PhotoBlob,private(bit),…}

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

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

    文档: TagMap_文档{TagMap_文档SID,DocID,TagID} 文档{DocID,Location/Blob,TenantID,CreatorID,private(bit),…}

    照片: TagMap_照片{TagMap_照片ID,照片ID,照片ID} 照片{PhotoID,URL,PhotoBlob,TenantID,CreatorID,private(bit),…}


在这里寻找银弹,可能需要比整个狩猎过程更多的思考;)如果不是这样,那么我们就不会有任何乐趣了:)

所以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}

    利用租户和用户表 租户{TenantID,Name,…} 用户{UserID,Name,…}

    文档: TagMap_文档{TagMap_文档SID、DocID、TagID、TenantID、CreatorID} 文档{DocID,Location/Blob,private(bit),…}

    照片: TagMap_照片{TagMap_照片ID,照片ID,TagID,租户,创建者} 照片{PhotoID,URL,PhotoBlob,private(bit),…}

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

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

    文档: TagMap_文档{TagMap_文档SID,DocID,TagID}