mongoDB新手问多对多关系的文档设计
发布于 10 年前 作者 kilik52 5668 次浏览 最后一次编辑是 8 年前

我看了cnodejs的源码,里面话题是topic,源码里面还有tag,对于一个话题,发布者可以设置多个tag。而一个tag里面也会有许多topic。这个是典型的多对多关系。 cndoejs的设计是这样的:有三个表,一个topic,一个tag,一个topic_tag。这个思路和关系型数据库是一样的。 我另外有一种办法。就是topic里面有一个tags数组,里面存放了tag的id,然后tag里面有一个topic数组,里面存放了topic的id。请问这样的设计好不好?会不会有什么问题?

5 回复

范式 和 反范式得 区别, 对于经常改动得东西,用范式, 不怎么改动,而且经常需要搜索得结果,一般用反范式,对于 一个tag 里面 存放多个tagid 是一个极度 不理智得行为,要想一下,你生成一个主题,需要遍历10篇文章里面得tagid,然后根据tagid找名字,菜都凉了,tag 一般都是一次生成,后面基本不怎么改动,如果需要搜索 也是 很简单得, tags: [tagName1, tagName2] db.collection.find({tags: tagName1}) mongodb 支持数组搜索。当然这样做也是有缺点得,tag作为数组,索引得空间会比较大,注意数组与数组之间做索引

感谢回复。我不是一个tag 里面 存放多个tagid。是这样的: topic: { tags: [tag_id1, tag_id2] }

tag: { topics: [topic_id1, topic_id2] }

等于是把topic_tag这个表合到两个表里面去了。而不是另外有一个表叫topic_tag

tag里面不应该存topic,如果想查找tag对应的topic列表可通过条件查找来topic实现

明白了,非常感谢!

这个给我先前遇到的问题差不多,当时所有的数据都放在了一个集合中,标签是一数组的形式保存,这样当一个页面需要两种数据的时候,调取数据就比较麻烦,后来请教人他说标签单独放个集合中。

回到顶部