11

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

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

4

1 回答 1

14

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

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

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

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

于 2012-12-14T16:38:15.673 回答