gpt4 book ai didi

java - 需要 AppEngine 数据存储区设计建议

转载 作者:行者123 更新时间:2023-12-01 15:43:31 25 4
gpt4 key购买 nike

我正在构建一个分布式会计系统。就数据库结构和要求而言,将应用程序描述为类似 Twitter 的应用程序可能是最简单的,但具有 14 个表的分层数据库结构。使用该应用的公司可能有 1 个或更多用户,所有用户都共享公司信息。

目前,每个实体代表一种记录类型,即客户、发票等。所有实体都有一个父实体,即应用程序的用户。 (出于 HRD 查询一致性原因)

对数据库的每个查询都包含 14 个 AppEngine 查询。每 table 一个。该查询涉及属性过滤。

一个新的要求是,用户的查询可能需要基于其他每个用户的不同属性值。这意味着我们需要(14 x 公司用户数量)AppEngine 查询。这似乎太过分了。

可以按属性过滤的 Kindless Ancestor 查询真的很好,可惜,没有:)

我的选择是:

  1. 将实体种类设置为用户。没有 parent 。这意味着所有记录类型都是混合的。 (过滤的字段存在于所有记录类型中)。这不太漂亮。但你会考虑这一点吗?

  2. 具有固定的实体类型,并且仅通过过滤器进行查询。结果相当于 Kindless Ancestor 查询。但是,我担心多用户使用时会很慢。

一些数字:我们计划覆盖 10,000 家公司,平均每家公司有 5 个用户,每种记录类型有 1 到 500 万条记录。 (总共 x 14)

感谢您到目前为止的耐心等待..:)

最佳答案

老实说,我发现很难理解您的描述,所以这可能是错误的。查看您现有的代码可能会有所帮助。但我知道您想要一种有效的替代方法来替代有属性的无种类祖先查询,所以让我们从这里开始。

考虑对数据模型进行反规范化以包含仅用于查询的元实体:

class User(db.Model):
pass

class OwnedObject(db.Expando):
object_key = db.StringProperty()

class Customer(db.Model):
name = db.StringProperty()
created_on = db.DateProperty()

class Invoice(db.Model):
amount = db.IntegerProperty()
created_on = db.DateProperty()

# on write
customer = Customer()
customer.name = name
customer.created_on = date.today()
customer.put()

user = User(key_name=users.get_current_user().user_id())

owned_object = OwnedObject(parent=user)
owned_object.object_key = customer.key()
owned_object.created_on = customer.created_on
owned_object.put()

# on read
query = OwnedObject.all()
query.ancestor(user)
query.filter('created_on =', date.today())

entities = db.get([x.object_key for x in query])

因此,您在写入方面要做更多的工作,而在读取方面要做的工作较少。

每个真实实体都与一个 OwnedObject 实体耦合,该实体从适当的祖先派生并指向真实实体的键。 OwnedObject 是一个扩展,因此您将急切地分配要查询的任何属性(在本例中为created_on)。

读取时,您可以查询已复制到 Expando 元实体的任何属性,并且可以以一次查询和一批获取的固定开销拉回用户的所有对象。

编辑:您可以使用PolyModel在没有元实体的情况下完成类似的操作。 .

关于java - 需要 AppEngine 数据存储区设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7595813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com