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、公司和类型查询。尤其是本质上是分等级的,一个公司有多种车型,每种车型都有多辆实车。
我至少可以看到三种建模方式:
- 在标识符中对其进行编码:
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"
})
- 在父键中对其进行编码:
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"
})
- 查询一下:
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_id
、company
和 Type
高效查询。
但是,出于其他一些原因,您可能希望选择其中一种解决方案:
- 如果您想存储每个公司的信息,例如地址,您应该创建一个公司实体。
- 如果您希望能够在同一事务中以强一致性检索和更新 Company 和 Cars,必须 具有 parent/child 关系。
- 每个实体组每秒写入一次更新的限制。因此,如果您希望每秒能够多次更新同一家公司的汽车,则不应使用父子关系。
- best practice 是为了避免对狭窄范围的键进行大量读取和写入。出于这个原因,您可能更愿意拥有一个随机分配的 ID,而不是依赖数据集中可能导致访问模式偏斜的某些内容。
我对数据存储感到困惑 - 特别是我很难决定在哪里存储有关我的对象的信息。
例如我有一辆车,属于一家公司。 在 JSON 中,这可能看起来像这样:
{
"car_id": "car001", # only unique among a particular owner
"company": "company001",
"value": 5200 # dollars
"Type": "Truck"
}
company 和 Type 被限制为几十个值。 我会经常按 ID、公司和类型查询。尤其是本质上是分等级的,一个公司有多种车型,每种车型都有多辆实车。
我至少可以看到三种建模方式:
- 在标识符中对其进行编码:
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"
})
- 在父键中对其进行编码:
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"
})
- 查询一下:
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_id
、company
和 Type
高效查询。
但是,出于其他一些原因,您可能希望选择其中一种解决方案:
- 如果您想存储每个公司的信息,例如地址,您应该创建一个公司实体。
- 如果您希望能够在同一事务中以强一致性检索和更新 Company 和 Cars,必须 具有 parent/child 关系。
- 每个实体组每秒写入一次更新的限制。因此,如果您希望每秒能够多次更新同一家公司的汽车,则不应使用父子关系。
- best practice 是为了避免对狭窄范围的键进行大量读取和写入。出于这个原因,您可能更愿意拥有一个随机分配的 ID,而不是依赖数据集中可能导致访问模式偏斜的某些内容。