2

我正在为Android制作一个即时通讯应用程序,并在后端使用Java和应用程序引擎。在处理海量数据时,在数据存储中定义实体的正确方法是什么?

要在后端存储对话和消息,我有2个选项(如我所见)来存储数据。

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

OR

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

虽然在技术上都可以工作,我不明白有关数据存储的限制(如1对于某些实体,写/秒),在查询时担心CPU开销,并且可能有数百万个消息根条目。我想我不确定是否需要祖先实体,或者最适合这样的应用。

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

回答

1

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

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

+0

这正是我所想的/担心的。谢谢你对我的确认很清楚。 – Japes

+0

你编辑让我困惑。我认为数据存储在acestral结构中只允许1次写入/秒。所以在一个可以让很多人快速发送消息的群体对话中,这种对话是有限的。 我想如果结构和写入速度有限制,为什么我不能在根中创建所有类型? – Japes

+0

但是每个独特的对话是在两个人之间对吗?他们不会那么快写下来,如果他们在爆发时做出来,你可以用指数回退来处理 –

相关问题