Sai*_*Sai 2 many-to-many mongodb graph-databases
我试图了解嵌入Mongodb,但找不到足够好的文档.不建议链接,因为写入在文档中不是原子的,并且还有两个查找.有人知道如何解决这个问题,或者你建议我去像neo4j这样的图表dbs.
我正在尝试构建一个需要多对多关系的应用程序.为了解释,我将以图书馆为例.它可以根据他的朋友正在阅读的书籍以及用户正在阅读的邻居(像头脑一样)向用户推荐书籍.
有用户和书籍.用户借书并拥有其他用户的朋友
用户= [
Run Code Online (Sandbox Code Playgroud){ name: 'xyz', 'id':'000000', friend_ids:['949583','958694']} { name: 'abc', 'id':'000001', friend_ids:['949582','111111']} ]书籍= [
Run Code Online (Sandbox Code Playgroud){'book':'da vinci code', 'author': 'dan brown', 'readers'=['949583', '000000']} {'book':'iCon', 'author': 'Young', 'readers'=['000000', '000001']} ]
如上所示,通常我需要两个文件,如果我采用mongo DB,因为我可能双向查找.将文档复制(嵌入)到另一个文档可能导致大量的重复(这些模式可以存储比显示的更多的信息).
我是否正确建模数据?这可以在mongodb中有效地完成,还是应该查看图形dbs.
免责声明:我为Neo4j工作
从您的大纲,要求和数据类型看,您的应用程序似乎是图形数据库的甜点.
我建议你用图表数据库做一个快速的峰值,看看它是怎么回事.
一些问题:
上面的基本模式提议适用于MongoDB,并提出一些建议:
_id字段而不是id,因为此字段始终存在于MongoDB中并且在其上创建了默认的唯一索引.这意味着你的_ids总是独一无二的,查找_id速度非常快.你是对的,使用这种模式将需要多个find()s,并且每次都会产生网络往返开销.但是,对于您在上面建议的每个查询,您需要不超过2次查找,并结合一些简单的应用程序代码:
db.books.find({_id: {$in: [list, of, books, for, the, user]}}),然后$inlikedb.users.find({_id: {$in: [list, of, users, reading, book]}})我应该注意,$in如果你有很长的列表可能会很慢,因为它实际上相当于为N个项目列表进行N次查找.但是,服务器会为您执行此操作,因此它只需要一个网络往返而不是N.
作为使用$in其中一些查询的替代方法,您可以在数组字段上创建索引,并在集合中查询数组中具有特定值的文档.例如,对于上面的查询#1,您可以执行以下操作:
// create an index on the array field "readers"
db.books.ensureIndex({readers: 1})
// now find all books for user whose id is 1234
db.books.find({readers: 1234})
Run Code Online (Sandbox Code Playgroud)
这称为多键索引,并且$in在某些情况下可以表现得更好.您的确切体验将根据文档数量和列表大小而有所不同.
| 归档时间: |
|
| 查看次数: |
1949 次 |
| 最近记录: |