- 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/
我正在尝试用我以前的类(class)笔记填充数据存储,以便将来我可以添加评论板或留言簿等笔记。 我似乎无法在数据存储中获取以前的注释,并且一直在翻阅 GAE 文档并在网上搜索无济于事。 这是我的代码:
我得到以下异常: Exception in thread "main" com.google.cloud.datastore.DatastoreException: no matching index
我们有一个在美国和欧盟托管的应用。为了获得出色的性能,我们将在两个位置托管一个数据存储实例。 现在的问题是如何将数据从美国数据存储复制到欧盟数据存储? 或者从技术角度来看,我们将数据存储在哪里并不重要
当我调用 datastore.save 方法时,我偶尔会遇到以下错误: 错误:在/user_code/node_modules/@google-cloud/datastore/node_modules
我正在使用适用于 Datastore (google-cloud-datastore) 版本 1.4.0 的 Python 客户端 SDK。我正在尝试运行仅键查询获取: query = client.
我正在试验 Google App Engine's flexible Python 3 environment and Cloud Datastore .在本地测试时,这(通常)要求在类似 Gunic
Google Cloud Datastore 是否支持计数器等原子操作?我在文档中没有看到任何相关内容,我注意到更新基本上是获取整个对象,更新一个字段,然后将整个对象发送回去,这似乎会使原子操作变得不
我的数据存储实体将具有 embedded entity type 的属性. 在我将它们保存如下后( 我正在使用 gcloud v0.27.0 ): dataset.save([{ key: d
是com.google.cloud.datastore.Datastore线程安全?更具体地说,Datastore 的一个实例可以吗?由多个线程共享,并且它们都可以同时读取/写入云数据存储吗? 换句话
Cloud Dataflow页面暗示这是可能的,但我还没有在 Google Cloud Datastore 文档中找到观察更改事件的方法。它是如何完成的? 最佳答案 据我所知,Cloud Datast
Google Cloud Firestore 将很快取代旧的 Google Cloud Datastore。然后可以选择在“ native 模式”或“数据存储模式”下使用 Cloud Firestor
我是 Datastore 的新手,我正在尝试创建一个简单的应用程序来跟踪图书借阅情况。 我希望数据库架构如下: books: book_id name: borrowing: time
这个问题已经被回答过很多次了,但答案似乎总是在变化。 我正在使用 Java 在 Windows 中工作,并且有一个本地数据存储实例,我希望将其作为生产的副本。 之前有两个答案:- How to cre
如何通过 Google Cloud Datastore 中的 API(Python Protocol Buffer )删除整个祖先树? 例如,如果我将实体存储在此结构中:祖父/父/子,我如何删除祖父,
我想在 Google Cloud Datastore(Datastore 模式下的 Firestore)中保存一部分结构。 以电话簿和联系人为例。 type Contact struct { Ke
我正在尝试看看仅使用 Cloud Functions 与 Datastore 交互是否可行。 有没有一种方法可以仅使用 Cloud Functions 创建复合索引(如 index.yaml)?因此只
我注册了 Firebase 以使用新的 Firestore。 尝试后,我决定,对于我的用例(主要是服务器工具),我不需要 Firestore 的大部分功能,这些功能非常专注于构建用户界面,而且我发现旧
我目前正在使用一台按顺序运行并从命名空间中读取实体的机器执行迁移,这对我来说很痛苦。是否可以使用 Google Cloud Dataflow 更轻松地执行迁移? 最佳答案 您应该能够使用 Datast
我想在 MongoDB 中使用 Grails2.5 中的“ElasticSearch”插件。我的“BuildConfig.groovy”文件是: grails.servlet.version = "3
我想从 Rails 应用程序中使用 Google Cloud Datastore。任何 Ruby 库都可以让这一切变得简单? 最佳答案 您可以使用官方的 Google API Client for R
我是一名优秀的程序员,十分优秀!