Python 2.7 需要查询多个实体(千个)时具有很强的一致性

Python 2.7 需要查询多个实体(千个)时具有很强的一致性,python-2.7,google-cloud-datastore,datastore,Python 2.7,Google Cloud Datastore,Datastore,在一个有许多“商店”的应用程序中,每个注册的管理员用户都有一个“商店”实体,每个商店销售的商品都属于某个“类别”。拥有多个客户(在某些情况下为100个),每个客户都有一个帐户来跟踪其购买和过去的订单。每家商店为客户开具发票,客户支付发票金额 Admin User -- > Shop Shop ---> clients |-> items Categories |-> items |-> invoices |->

在一个有许多“商店”的应用程序中,每个注册的管理员用户都有一个“商店”实体,每个商店销售的商品都属于某个“类别”。拥有多个客户(在某些情况下为100个),每个客户都有一个帐户来跟踪其购买和过去的订单。每家商店为客户开具发票,客户支付发票金额

Admin User -- > Shop 

Shop ---> clients
      |-> items Categories
      |-> items
      |-> invoices
      |-> payments received
管理页面显示一份报告,显示一年内(从1月到12月)的发票。此页面是客户的要求。商店可以在购买时手动生成新发票,并在付款时记录付款。注意:这一切都发生在实际的商店中,没有在线客户购买

由于单个店铺每月生成的发票很少(~100),每月生成的付款也很多(~100),因此每年显示这些信息的实体很容易就可以在一个页面上显示数千个

为了优化加载页面和生成销售年度报告(总销售额、收入、付款等),我们认为应该以每年每个项目类别也是一个实体的方式来构造数据。这意味着,每当为该类别中的某个项目进行采购时,我们都需要将该项目的采购价格添加到该月份该年度的itemCategory中

项目类别模型:

通过这种方式,我们可以通过只读取该商店今年的itemCategory列表来加载整个销售表,而不是读取全年的所有个人购买。这将节省大量的数据存储读取,并减少页面加载时间,但需要额外读取、求和和和写入类似于摘要的实体

Category      Jan   Feb   Mar ... Dec
--------------------------------------
Men's shoes   1000  1300  850 ... 1400
Kids shoes     600   850  650 ...  900
在这一点上的挑战是,对于个人购买和itemCategory实体来说,强大的一致性非常重要。因为如果商店试图以连续的短时间方式添加多个购买,最终一致性itemCategory可能尚未更新为最后一次购买金额。导致错误的销售价值。同样,对于个人购买,如果需要在添加实体后立即对其进行编辑,则对于没有实体ID的实体的查询可能不会有结果。因此,祖先查询在这里似乎是必不可少的,可能商店是父实体。然而,这将导致以后(至少在数据存储迁移到Firestore之前)所有这些实体(本例中有数千个)都只有一个父实体时出现争用问题

发票也是如此,生成新发票意味着知道最新的发票编号,以便它们始终按顺序排列,没有间隙。查询具有最终一致性的发票可能会导致重复的发票编号


在这一点上,构建数据结构以实现强一致性的最佳方式是什么?不幸的是,该项目已经存在了几年,并且开始使用谷歌数据存储而不是云SQL(这似乎更适合此类项目)。希望所有这些问题在迁移到Firestore后都能解决,Firestore具有很强的所有读取一致性

请考虑导出数据,然后在数据存储模式项目中将其导入到云Firestore中。没有更多的最终一致性问题

有一些方法可以让你达到强烈的一致性

  • 使用
    键进行查询
    。无论何时尝试通过对象的键读取对象,它都是强一致的
  • 另一种方法是使用NDB异步操作。请参阅此处的相关内容
  • 一个非常简单的方法是提供一个可以帮助您的延迟,但是延迟应该以这样一种方式提供,即对象足以得到更新
  • 最后一种方法可能是将数据导出到云Firestore。在那里,您可以始终实现强大的一致性
  • 希望这能回答你的问题

    嗨。。1) 不幸的是,我无法通过密钥获取,需要通过DB实体进行“查询”,这就是最终的一致性。2) NDB异步操作是一个非阻塞获取请求,但据我所知,它不能确保强一致性。3) 我认为这在产品上不可行。4)我希望找到一种解决方法,至少在自动迁移发生之前:)
    Category      Jan   Feb   Mar ... Dec
    --------------------------------------
    Men's shoes   1000  1300  850 ... 1400
    Kids shoes     600   850  650 ...  900