Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.9k views
in Technique[技术] by (71.8m points)

请问下文章的分类或者标签在mongodb中该怎么存储好

因为文章是可以关联到多个分类的,一个分类也可以被多个文章关联,这样会形成一个多对多的关系,然后一个分类也有多个子分类,感觉搞起来有点复杂,不知道数据库模型要怎么设计。。。目前想到的方案如下

方案1:

  1. 单独建立一个分类集合,以对象数据格式存储他的子分类这样,每次加文章把文章id再关联到他的分类ID上,如果是子ID则就继续关联到子ID上
  2. 然后文章关联的时候再把这个单独的分类集合再当成数据存储到文章集合里面,用数组的方式存储,这样就保证了每次查文章就查一个集合,但是会导致数据库数据重复问题,还有一个问题就是改分类的名称,要把整个文章集合给薅一遍 一个个把正确的名字给改过来。。

方案2:
单独建立一个分类集合,然后关联一个主键ID到文章上线,然后每次查文章的时候直接查两个集合 文章集合 拿到 分类ID 继续往下查 分类的集合

求问 有没有什么最佳方案。。。 感觉有点乱


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

mongo是非关系数据库,联表查询的能力比较弱,所以要采用非范式的数据库设计。既然有子分类,那分类肯定需要单独一个集合。一个文章关联多个分类,就是一个字段数组保存分类信息就好了。

mongo提倡通过冗余提高应用的查询效率。就是对于文章的分类而言,什么是最重要的:分类id是最重要的,所以必须存储。集成分类的主要目的是什么,显示所属分类的名称,所以可以直接把分类名称冗余到文章分类下面。那分类的名称改变了怎么办?mongo有说明,让应用端自己处理同步:就是通过api更改分类名称的时候,也需要通过修改包含该分类的文章下的冗余数据。这个地方不需要实时,因为分类id总是正确的,所以可以通过广播,或者队列来处理同步的事件,复杂的就放在晚上。业务一定要有所取舍,诸如github你更改名称都需要转一会儿,才能修改完。一般情况下,一定要限制修改,慎重修改。

分类基本设计

{
   "_id":"asfsaf",
   "name":"",
   "parent":""
}

文章分类字段

{
   "category":[
      {
         "_id":"asfsafsa",
         "name":"asfasfas"
      },
      {
         "_id":"asfsafsa",
         "name":"asfasfas"
      }
   ]
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...