如何在Firestore中构造绘图应用程序的数据?

时间:2019-05-28 15:05:07

标签: database firebase google-cloud-platform google-cloud-firestore data-modeling

我正在用react-native + Firestore开发一个应用程序,该应用程序旨在为每个填写表格的用户生成随机数/票证。这些数字将使用户能够参加电子彩票并竞争促销的奖励。

这些数字应按序列分开,例如:

Series 1 - numbers can range from 0 to 99,999 thousand.
Series 2 - numbers can range from 0 to 99,999 thousand.
Series N - numbers can range from 0 to 99,999 thousand.

系统要求是:

  • 必须维护为每个用户生成的系列和编号(为客户端保存的编号);
  • 每个促销还必须包含生成的数字和系列(在“促销”中生成的数字,总计);

在firebase.firestore的第一个结构中,我们创建了如下结构:

Promotion - Series - Number
(random doc) - 01 - 00131 ...
(random doc) - 01 - 97879 ...
(random doc) - 09 - 99999

促销是一个集合,系列是一个促销子集合,数字是一个系列子集合。

但是,通过这种方式,例如,在firestore API中进行了许多查询,以获取要在系列中生成的可用数字,以便可以生成新的数字。

我们发现的另一种方法是,数字的子集合可以是Series集合中的一个数组。这样可以减少查询。

100,000个数字数组会超过最大1mb文档大小吗? 例如,可以使用带有map的结构来写一些其他属性,如下所示:

Promotion - Series - Numbers: Map?

1 个答案:

答案 0 :(得分:0)

“ 100,000个数字数组会超过最大1mb文档大小吗?”

数组中的每个数字将消耗8 bytes,因此仅数组值将为〜800KB,然后加上一些文档和字段名的开销,您仍应处于限制之内。

但是,您将需要确保进入UI的Single Field Indexes(单字段索引)并为数组字段创建exemption,因为每个数组值消耗2个索引条目(整个数组本身消耗2个索引条目),因此您绝对会超过每个文档2万个索引条目的限制。注意:这意味着您将无法查询数组。

“但是,通过这种方式,例如,在firestore API中进行了许多查询,以获取要在系列中生成的可用数字,以便可以生成新的数字。”

我猜这两个不成文的假设:

  1. 同一号码不能分配给多个客户
  2. 将分配系列中的大多数数字

如果2不正确,您可以生成一个数字,查看它是否存在,然后重新生成,然后重试。如果将分配大多数或所有号码,这将变得更加昂贵。

另一种方法是采用混合方法

对于100,000个数字,创建1000个文档,每个文档拥有100个数字,并将这100个数字存储在名为ticket_number的数组中:

/promotions/<series number>/numbers/<nnnn>
--> ticket_number: [nnnn01, nnnn02, ..., (nnnn+1)00]

在每个文档上都有一个名为available的布尔字段,如果该范围内的数字仍然可用,则将其设置为true。如果不是,请删除该字段或将其设置为false

使用method outlined herefull == true的这些文档中选择一个随机文档。从此文档中,从数组中选择一个随机票证编号,将其删除并更新文档。

最终,将以这种方式选择所有值,而只需要为每张票证读写单个文档(以及将选定的编号/系列写到单独的文档中)。