GCP 数据存储:如何建模数据?

GCP datastore: How to model data?

我对数据存储感到困惑 - 特别是我很难决定在哪里存储有关我的对象的信息。

例如我有一辆车,属于一家公司。 在 JSON 中,这可能看起来像这样:

{
"car_id": "car001", # only unique among a particular owner
"company": "company001",
"value": 5200 # dollars
"Type": "Truck"
}

company 和 Type 被限制为几十个值。 我会经常按 ID、公司和类型查询。尤其是本质上是分等级的,一个公司有多种车型,每种车型都有多辆实车。

我至少可以看到三种建模方式:

  1. 在标识符中对其进行编码:
 key = client.key("Car", "{company}_{type}_{car_id}")
    entity = datastore.Entity(key=key)
    entity.update({
"car_id": "car001", # only unique among a particular owner
"company": "company001",
"value": 5200 # dollars
"Type": "Truck"
})
  1. 在父键中对其进行编码:
 company_key = client.key("Company", "Company001") 
 type_key = client.key("Type", "Truck", parent=company_key)
 key = client.key("Car", car_id", parent=type_key)
    entity = datastore.Entity(key=key)
    entity.update({
"car_id": "car001", # only unique among a particular owner
"company": "company001",
"value": 5200 # dollars
"Type": "Truck"
})
  1. 查询一下:
 key = client.key("Car") # identifier is automatically assigned, kind should be Car
    entity = datastore.Entity(key=key)
    entity.update({
"car_id": "car001", # only unique among a particular owner
"company": "company001",
"value": 5200 # dollars
"Type": "Truck"
})

在属性的应用程序查询中。

但是最好的是什么?对于我知道的其他 NoSql 数据库,通常会有一些关于如何使用它的指南(RavenDb、Cassandra 等),但我无法为数据存储找到这样的东西。

Datastore automatically indexes 每个 属性,因此您可以在所有三个建议的布局中通过 car_idcompanyType 高效查询。

但是,出于其他一些原因,您可能希望选择其中一种解决方案:

  • 如果您想存储每个公司的信息,例如地址,您应该创建一个公司实体。
  • 如果您希望能够在同一事务中以强一致性检索和更新 Company 和 Cars,必须 具有 parent/child 关系。
  • 每个实体组每秒写入一次更新的限制。因此,如果您希望每秒能够多次更新同一家公司的汽车,则不应使用父子关系。
  • best practice 是为了避免对狭窄范围的键进行大量读取和写入。出于这个原因,您可能更愿意拥有一个随机分配的 ID,而不是依赖数据集中可能导致访问模式偏斜的某些内容。