- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 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/
我创建了一个基于命令行可移植脚本的工业化不可知构建系统,可用于快速构建多个依赖项目,而不必依赖特定的 IDE 或构建工厂。它是不可知的,因为它不是基于单个构建引擎。我使用 cmake 创建了第一个版本
我最初使用 Java 目标开发了一个语法(用于 TestRig 支持),然后将其移植到 Python(从 git hub 语法存储库扩展了 Python3 语法,因此需要将操作移植到 Python
我有一个以 iPhone 和 watchOS 为目标的 Xcode 项目。 iPhone 目标使用加速度计,模拟器不支持。我可以只启动 iPhone 应用程序而不启动 watch 目标吗?我从: Ca
您好,我想创建一个批处理文件,用于在 .eml 文件(目标 A)中查找某些关键字,然后删除它们所在的行。之后,我需要批处理文件将"new"文件放入(目标 B)中的单独 .eml 文件中。文件也可以是
当尝试通过 IntelliJ 运行示例 CorDapp (GitHub CorDapp) 时,我收到以下错误: Cannot inline bytecode built with JVM target
我在尝试向我的 kotlin spring 项目添加一些依赖项时遇到问题。我使用 spring boot 初始化程序来运行一个基本项目。 我的问题:如果我取消对 jackson 或 Koin 依赖项的
这是有问题的网站: http://www.onepixelroom.com/londonrefurb 当我点击关于部分后面的多个圆圈时,我希望它更改上面文本中的引号。 到目前为止,我得到它来显示 文本
单击后,我将删除两个元素 $(this) 和 $("#foo")。 目前我的代码如下所示: $(this).remove(); $("#foo").remove(); 如何在不重复自己的情况下优化它?
我有一个小脚本,可将 Markdown 文件编译为 html,并将其与一些样式表和 javascript 一起插入到模板的主体中。我有一个 GNU makefile 来完成这个: output.htm
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
一些背景知识: 在android中我们开发了同样的应用,基本上我们先开发了Android应用,现在我们创建了它的IOS版本,所以这个应用有多个客户端。在 android 中,我们实际上是使用 Andr
我想知道是否可以使用 knockout 来更改html中的目标() 我的所有其他信息都在 JavaScript 中,所以这对我来说是一个大问题。这是我的 JavaScript: var library
这个问题在这里已经有了答案: Selecting and manipulating CSS pseudo-elements such as ::before and ::after using j
我在我的有向图中添加了一堆节点和顶点,使用设置 typedef boost::adjacency_list graph; 创建 Node有一个节点名称字符串,Edge它的分数有一个整数。我试图遍历所有
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
如何存储我在 NSUserDefaults 中创建的 Goal 类型的对象数组? ( swift ) 代码如下: func saveGoalList ( newGoalList : [Goal] ){
Array.prototype.indexOf 和 Date.now 已在 ES5 中引入。如果我编译存储在文件 test.ts 中的以下代码,为什么 Typescript 不能转译? Date.no
我正在阅读有关属性的内容,并了解到可以使用您的代码将它们应用于不同的目标实体 -(请参阅 Attribute Targets)。 因此,查看我项目中的 AssemblyInfo.cs 文件,我可以看到
给定一个 Makefile: all: build/a build/b build/c # need to change this to all: build/* build/a:
我有一个带有多框架目标的项目- netstandard2.0;net471 . 我想为 netframework 构建解决方案和 netstandard分别。 目前我使用这个 MSBuild 命令:
我是一名优秀的程序员,十分优秀!