我看了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作为数组,索引得空间会比较大,注意数组与数组之间做索引