在处理海量数据时,在数据存储区中定义实体的正确方法是什么?

时间:2015-05-07 07:12:30

标签: java android database google-app-engine google-cloud-datastore

我正在为Android制作一个即时消息应用程序,并为后端使用Java和app引擎。

要在后端存储对话和消息,我有两个选项(我认为)来存储数据。

创建2个根实体:  对话(ID,消息ID)和消息(ID,“文本”)。

OR

会话(ID)消息(会话实体的孩子)(ID,“文本”)

虽然从技术上讲两者都可以工作,但我不了解数据存储区的限制(对于某些实体来说是1次写入/秒),我担心查询时的CPU开销,以及可能有数百万条消息根条目。我想我不确定是否需要祖先实体,或者最适合这样的应用程序。

tl; dr建立这样一个数据库的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

不要使用祖先查询除非您确定它们符合您的需求。这对我来说是关于数据存储最令人困惑的部分,因为起初,父/子似乎是一种很好的方式来构建像树一样的数据。
简而言之,在编写数据时必须具有中间一致性时使用它们。它对总大小和每秒写入数有一些限制。

不要担心拥有数百万“根”实体。这正是数据存储区(以及一般的nosql)的优点 所有数据存储区查询都是高效的,它甚至不会让你运行一个它不是(所以你必须事先添加所有需要的索引)因此不要担心查询性能,除非你不能用索引表达查询。
在你的情况下,鉴于一个对话不应该是巨大的,用户通常不会每秒输入超过5个条目,你可以使用祖先,你将在每个对话中获得中等一致性。
在这一点上,我认为它太宽泛,不能要求建筑,但这应该指出正确的方法。