mongodb - 使用 MongoDB 进行内容标记

标签 mongodb database-design tagging

我想使用 MongoDB 实现内容标记。在关系数据库中,最好的方法是在 content(例如,“products”)和 tags 表之间建立多对多关系。但是 NoSQL 数据库的最佳方法是什么?

将每个标签放在“内容”文档的 tags 数组中,还是将对 tags 的引用放在字符串中会更好吗?

最佳答案

在 MongoDB 中有 n:m 关系的大多数情况下,您应该使用嵌入而不是引用。所以我建议你在每个产品中都有一个带有标签名称的数组“标签”。我假设查看单个产品将是您系统中最常见的用例。这种设计将允许您通过单个数据库查询向用户显示带有标签名称列表的产品。

当您需要一些关于您不想绑定(bind)到产品的标签的额外元数据(如标签的长文本描述)时,您可以创建一个额外的标签集合,其中名称字段获取用于快速查找和避免重复的唯一索引。当用户点击或悬停在标签名称上时,您可以使用附加查询来获取标签详细信息。

此设计中的一个问题案例是您想要删除或重命名标签的情况。然后,您必须编辑包含该标签的每个产品。但是因为 MongoDB 不像 SQL 数据库那样知道带有 CASCADE ON DELETE 的外键,所以当您有文档相互引用时,您总是会遇到这个问题。

通过在产品的标签数组中存储 objectID 而不是名称,可以更轻松地重命名标签。但 ID 的缺点是它们对用户无用。您需要获取标签的名称才能显示产品页面。这意味着您必须从标签集合中请求每一个,这需要额外的数据库查询。

关于mongodb - 使用 MongoDB 进行内容标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13882516/

相关文章:

mongodb - 如何验证 mongo 索引是否正常工作?

java - 使用 vertx 将 Mongo 集合流式传输到 Kafka 主题的方法应该是什么?

java - 如何使用 Java MongoDB 驱动程序使用正则表达式和复杂条件对集合进行代码查找?

sql - 是否有一个术语来描述只应使用最后一个值的表?

node.js - Mongoose 查找匹配输入子字符串的所有文档

json - 使用 mongodb java 驱动程序运行 native mongodb 查询

mysql表设计问题

database - 行建模和 EAV 之间的区别

python - 将列表写入 Excel

CouchDB:查询 "documents tagged with A or B"?