【问题标题】:How to structure the data of a lottery draw application in Firestore?如何在 Firestore 中构造彩票开奖应用程序的数据?
【发布时间】:2019-10-14 03:42:41
【问题描述】:

我正在 react-native + Cloud 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.

系统要求是:

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

在 Cloud Firestore 的第一个结构中,我们创建了如下结构:

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

Promotion是一个集合,Series是一个promotion子集合,Number是一个Series子集合。

但是,通过这种方式,已经在 firestore API 中进行了许多查询,例如,获取要在系列中生成的可用编号,从而可以生成新编号。

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

100,000 个数字数组是否会超过最大 1mb 文档大小? 它可以用于带有 map 的结构,例如,写入超出数量的其他属性,如下所示:

Promotion - Series - Numbers: Map?

【问题讨论】:

  • 你也应该把标题翻译成英文!
  • 如果您唯一的问题是 100,000 个数字是否适合一个数组,那听起来您可以自己轻松尝试。

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


【解决方案1】:

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

数组中的每个数字都将消耗8 bytes,因此数组值大约为 800KB,那么文档和字段名称的一些开销仍应低于限制。

但是,您需要确保进入 UI 中的单个字段索引并为数组字段创建一个 exemption,因为每个数组值消耗 2 个索引条目(整个数组本身消耗 2 个),所以您肯定会超过每个文档的 20K 索引条目限制。注意:这意味着您将无法查询数组。

“但是,通过这种方式,已经在 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 here 从这些文档中选择一个随机文档,其中full == true。从此文档中从数组中选择一个随机票号,将其删除并更新文档。

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

写入速率注意事项

请注意,建议每个文档每秒写入 1 次的最大持续速率。在单文档方法中,这意味着数字分配缓慢或某些上游批处理机制。

通过使用混合方法,您可以跨更多文档进行分片,以提高写入率。在我上面给出的示例中,每秒写入 1000 次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2021-05-06
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多