【问题标题】:Are datastore indexes same across multiple namespaces?跨多个命名空间的数据存储索引是否相同?
【发布时间】:2018-10-08 19:25:02
【问题描述】:

我正在开发一个多租户 SaaS 系统,并将所有数据存储在 Datastore 中。我为每个客户端都有一个单独的名称空间,但所有名称空间中的“种类”都相同。

这是我的问题:如果我为一种实体类型构建自定义索引,该索引是否会在所有命名空间中提供?还是应该在某处指定命名空间?

这是我的自定义索引之一:

- kind: loginTrack  
  ancestor: no
  properties:
  - name: logDate
  - name: username
  - name: timeStamp

我将它部署为 Datastore 中的自定义索引,但我不确定它是否适用于所有命名空间。

Datastore 如何处理 developer-supplied-index?

【问题讨论】:

    标签: google-cloud-platform google-cloud-datastore


    【解决方案1】:

    正如您所观察到的,索引本身没有命名空间信息的空间,它在应用程序域内的所有命名空间中以相同的方式运行。

    不同的是映射到每个命名空间的数据存储分区。来自Multitenancy and partitioned data(强调我的):

    Cloud Datastore 使用分区来存储每个租户的数据。这 项目 ID 和命名空间 ID 的组合形成一个分区 ID, 它标识每个分区。一个实体属于一个单一的 分区,并且查询范围为单个分区

    但请注意,对某个租户的数据进行操作是您的应用程序的责任:所有与某个租户相关的操作必须在该租户的分区/命名空间上下文中执行(即必须将命名空间指定为与数据存储相关的调用的参数)。

    对于在租户域中使用(共享)索引的特殊情况,您必须在构建查询时指定租户的命名空间。否则您将无法从该租户的分区中获得结果。

    【讨论】:

    • 那么,如果我运行这个查询:Query<Entity> query = Query.newGqlQueryBuilder(Query.ResultType.ENTITY, gql).setNamespace(organizationID) .setBinding("program", programId).build(); 我的索引会应用于所有命名空间吗?
    • 不,只匹配OrganizationID
    • 但是我没有在索引文件的任何地方声明命名空间。 organizationID 来自用户的会话对象。那么,如果我根据会话的组织创建一个索引,该索引是否会应用于所有命名空间?
    • 索引定义和索引本身不是一回事。定义(即您配置的内容)是相同的/共享的。但是索引本身是(我怀疑,我实际上并不知道内部实现)每个命名空间分区。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2011-06-13
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多