Python 2.7 需要查询多个实体(千个)时具有很强的一致性
在一个有许多“商店”的应用程序中,每个注册的管理员用户都有一个“商店”实体,每个商店销售的商品都属于某个“类别”。拥有多个客户(在某些情况下为100个),每个客户都有一个帐户来跟踪其购买和过去的订单。每家商店为客户开具发票,客户支付发票金额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 |->
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中。没有更多的最终一致性问题 有一些方法可以让你达到强烈的一致性
键进行查询
。无论何时尝试通过对象的键读取对象,它都是强一致的李>
Category Jan Feb Mar ... Dec
--------------------------------------
Men's shoes 1000 1300 850 ... 1400
Kids shoes 600 850 650 ... 900