【发布时间】:2014-05-29 21:04:09
【问题描述】:
Google Apps Engine 提供 Google Datastore 作为唯一的 NoSQL 数据库(我认为它基于 BigTable)。
在我的应用程序中,我有一个类似社交的数据结构,我想像在图形数据库中那样对其进行建模。我的应用程序必须保存异构对象(用户、文件、...)以及它们之间的关系(例如 user1 OWNS file2、user2 FOLLOWS user3 等)。
我正在寻找一种模拟这种典型情况的好方法,我想到了两种解决方案:
-
基于列表的解决方案:任何对象都包含其他相关对象的列表,并且列表中存在的对象本身就是关系(正如 Google 在 JDO 部分 https://developers.google.com/appengine/docs/java/datastore/jdo/relationships 中所说)。
李> 基于图形的解决方案:节点和关系都是对象。对象独立于关系而存在,而每个关系都包含对两个(或更多)连接对象的引用。
这两种方法的优点和缺点是什么?
关于方法一:这是大家能想到的比较简单的方法,官方文档中也有介绍,但是:
- 每个有向关系都会使对象记录增长:对可能的关系数量是否有任何限制,例如对象维度限制?
- 这是 JDO 功能还是数据存储结构允许自然实现该方法?
- 关系搜索时间会随着列表的增加而增加,此解决方案是否适用于大型(百万)关系?
关于方法 2:每个关系都可以具有更高级别的表征(它是一个对象并且可以具有属性)。而且我认为内存大小不是谷歌的问题,而是:
- 每个关系都需要自己的记录,因此每对相关夫妻的搜索时间会随着关系总数的增加而增加。这是否适合大量关系(数百万,数十亿)? IE。如果记录结构良好,谷歌是否有很好的技巧来搜索记录?或者我很快就会遇到这样的情况,如果我想搜索 User1 的一个名为 User4 的朋友,我必须等待几秒钟?
- 另一方面,每个对象的维度都不会随着新关系的添加而增加。
您能否帮助我找到这两种方法的其他要点,以便选择最佳模型?
【问题讨论】:
标签: java google-app-engine google-cloud-datastore nosql