我想使用MongoDB实现内容标记。在关系数据库中,最好的方法是在内容(例如“产品”)和标记表之间建立多对多关系。但是NoSQL数据库的最佳方法是什么?
将每个标记放在“内容”文档的标记数组中,或者将标记的引用放在字符串中会不会更好?
答案 0 :(得分:11)
在MongoDB中你有n:m关系的大多数情况下,你应该使用嵌入而不是引用。所以我建议你在每个产品中都有一个带有标签名称的数组“标签”。我认为查看单个产品将是您系统中最常见的用例。此设计允许您向用户显示带有单个数据库查询的标记名称列表的产品。
当您需要一些关于您不想绑定到产品的标签的其他元数据时(比如标签的长文本描述),您可以创建一个额外的标签集合,其中名称字段获取快速查找和避免重复的唯一索引。当用户点击或悬停在标记名称上时,您可以使用其他查询来获取标记详细信息。
此设计中存在问题的情况是您要删除或重命名标记时的情况。然后,您必须编辑包含标记的每个产品。但是因为MongoDB不像SQL数据库那样知道使用CASCADE ON DELETE的外键,所以当你有文件相互引用时,你总会遇到这个问题。
通过在产品的标记数组中存储objectID而不是名称,可以更轻松地重命名标记。但ID的缺点是它们对用户来说是无用的。您需要获取标签的名称以显示产品页面。这意味着您必须从tags集合请求每一个,这需要额外的数据库查询。