gpt4 book ai didi

google-app-engine - 我将如何使用 Google App Engine Datastore 实现这一目标?

转载 作者:太空宇宙 更新时间:2023-11-03 15:31:36 25 4
gpt4 key购买 nike

我是 Datastore 的初学者,我想知道我应该如何使用它来实现我想做的事情。

例如,我的应用需要跟踪客户及其所有购买情况。

来自关系数据库,我可以通过创建 [Customers] 和 [Purchases] 表来实现这一点。在 Datastore 中,我可以创建 [Customers] 和 [Purchases] 种类。

我遇到困难的地方是 [Purchases] 类型的结构。

如果我将 [Purchases] 作为 [Customers] 种类的子代,是否会有 [Customers] 中的一个实体和 [Purchases] 中的一个实体共享相同的 key ?这是否意味着在这个 [Purchases] 实体内部,我将拥有一个属性,该属性会随着他们进行的每次购买而不断增加?

或者我是否会为他们进行的每次购买创建一个 [Purchases] 实体,并且在这些实体中的每一个中我都会有一个属性指向 [Customers] 种类的实体?

Datastore 在这些场景中的表现如何?

最佳答案

听起来你并不完全了解祖先。让我们先使用非祖先版本,这是一种合法的方式:

class Customer(ndb.Model):
# customer data fields
name = ndb.StringProperty()

class Purchase(ndb.Model):
customer = ndb.KeyProperty(kind=Customer)
# purchase data fields
price = ndb.IntegerProperty

这是基本的方法。您将在每个客户的数据存储区中拥有一个实体。对于每次购买,您将在数据存储区中拥有一个实体,其中包含一个指向客户的关键属性。

如果您购买了商品,并且需要找到关联的客户,就在那里。

purchase_entity.customer.get()

如果您有客户,您可以发出查询以查找属于该客户的所有购买:

Purchase.query(customer=customer_entity.key).fetch()

在这种情况下,无论何时您写入客户或购买实体,GAE 数据存储都会将该实体写入云中运行的任何一台不繁忙的数据存储机器。您可以通过这种方式获得非常高的写入吞吐量。但是,当您查询给定客户的所有购买时,您只需读回索引中的最新数据。如果添加了新的购买,但索引尚未更新,那么您可能会得到过时的数据(最终一致性)。除非你使用祖先,否则你会坚持这种行为。

现在至于祖先版本。基本概念本质上是相同的。您仍然有一个客户实体,并且每个购买都有单独的实体。购买不是客户实体的一部分。但是,当您使用客户作为祖先创建购买时,这(大致)意味着购买存储在存储客户实体的数据存储区中的同一台机器上。在这种情况下,您的写入性能仅限于那台机器的性能,并被宣传为每秒写入一次。不过,作为一个好处,您可以使用祖先查询来查询该机器,并获得给定客户所有购买的最新列表。

使用祖先的语法有点不同。客户部分是一样的。但是,当您创建购买时,您可以将其创建为:

purchase1 = Purchase(ancestor=customer_entity.key)
purchase2 = Purchase(ancestor=customer_entity.key)

此示例创建两个单独的采购实体。每次购买都会有不同的 key ,客户也有自己的 key 。但是,每个购买 key 都将嵌入 customer_entity 的 key 。所以你可以认为购买 key 是两倍长。但是,您不再需要为客户保留单独的 KeyProperty(),因为您可以在购买 key 中找到它。

class Purchase(ndb.Model):
# you don't need a KeyProperty for the customer anymore
# purchase data fields
price = ndb.IntegerProperty

purchase.key.parent().get()

为了查询给定客户的所有购买:

Purchase.query(ancestor=customer_entity.key).fetch()

实体结构的实际变化不大,主要是语法。但是祖先查询是完全一致的。

不推荐您描述的第三个选项。我只是为了完整性而包括它。这有点令人困惑,并且会像这样:

class Purchase(ndb.Model):
# purchase data fields
price = ndb.IntegerProperty()

class Customer(ndb.Model):
purchases = ndb.StructuredProperty(Purchase, repeated=True)

这是一个使用 ndb.StructuredProperty 的特例。在这种情况下,您在数据存储区中将只有一个 Customer 实体。虽然有一个购买类,但您的购买不会存储为单独的实体 - 它们只会作为数据存储在 Customer 实体中。

这样做可能有几个原因。您只处理一个实体,因此您的数据提取将完全一致。当您必须更新一堆购买时,您还可以降低写入成本,因为您只编写一个实体。您仍然可以查询 Purchase 类的属性。然而,这是为有限数量或重复的对象而设计的,而不是数百或数千。每个实体的总大小限制为 1MB,因此您最终会达到这个大小,并且您将无法添加更多购买。

关于google-app-engine - 我将如何使用 Google App Engine Datastore 实现这一目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20293840/

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