【问题标题】:Modeling Forward and Reverse Query Questions in Bigtable在 Bigtable 中对正向和反向查询问题进行建模
【发布时间】:2019-05-12 21:12:38
【问题描述】:

假设我们有以下三个实体:

Organization
 - id

Role
 - id

Member
 - id

可以将角色授予组织内的成员,从而赋予该成员对该组织的某些访问控制权限。 我希望能够回答以下两个问题

  1. 列出在给定组织中具有给定角色的所有成员的 ID(例如,给定角色 ID 和组织 ID 给我成员列表)。
  2. 列出成员在给定组织内被授予的所有角色 ID(例如,给定成员 ID 和组织 ID 给我角色列表)。

我正在尝试找到有关如何在 Bigtable 中对此建模的建议(理想情况下使用单行进行原子突变)...我也对其他技术建议持开放态度(我正在尝试在我的约束范围内进行设计)公司给了我)。


如果我们使用 Bigtable 行键org#{orgID}#role#{roleID}#member#{memberID} 对上述关系进行建模,我可以轻松回答第一个问题。但是,它不允许我轻易回答第二个问题。如果我复制数据并存储另一个行键org#{orgID}#member#{memberID}#role#{roleID},那么我可以轻松回答第二个问题,但是现在我有两行要管理,并且不能保证两者之间的原子更新,因此可能会导致一致性问题。

社区中是否有人遇到过类似的问题,如果有,您是如何解决的?

【问题讨论】:

    标签: database google-cloud-platform bigtable google-cloud-bigtable


    【解决方案1】:

    披露:

    • 我领导 Cloud Bigtable 的产品管理。
    • 我共同创立了JanusGraph 项目。

    通读您的问题陈述,我听起来您想使用关系数据库或图形数据库。每个人都有自己的优点/缺点。

    关系 DBMS 方法

    正如 Dan 在 his answer 中提到的,您可以通过 Google Cloud SQLGoogle Cloud Spanner 使用托管 MySQL 或 PostgreSQL,具体取决于您对规模、复制、一致性、与现有代码/框架的兼容性等方面的需求。

    图数据库方法

    或者,您可以使用graph database,它可以帮助您轻松地建模此信息并有效地查询它。

    例如,您可以部署Janusgraph on GKE with Bigtable and Elasticsearch 并使用Gremlin language 查询数据,这是许多图数据库支持的标准图遍历/查询语言。

    请注意,JanusGraph + Bigtable 继承了 Bigtable 的事务性(如您所述,它是行级原子的)。由于 JanusGraph 存储 each vertex in a separate row in Bigtable,因此只有单顶点更新将是原子的。如果您想通过 JanusGraph 进行事务更新,您可能需要使用 different storage backend,例如,

    • BerkeleyDB(本地、非分布式存储后端)
    • FoundationDB(JanusGraph 社区最近的贡献)

    manyother图形数据库可以考虑,其中一些还支持Gremlin或其他图形查询语言。例如,您可以根据需要部署 Neo4j on GCP,它支持 Gremlin 和 Cypher。

    【讨论】:

      【解决方案2】:

      Cloud Bigtable 本身并不支持二级索引,因此您只需要一个行并能够高效地运行这两个查询,而无需进行全表扫描。您已经确定的替代方法是通过确保最终一致性的过程写入两行。根据系统的基本要求,这可能足以满足您的需求。

      根据您的限制条件(云提供商、数据规模、原子性、多区域复制等),您可能更适合使用标准关系数据库(例如 Postgres、MySQL)或Google Cloud Spanner

      使用 Spanner 实现此目的的可能方法:

      • 有一个表示成员 角色关系的表。将 RoleID 作为该行的主索引,然后为 MemberID 添加一个Secondary Index,您就可以对其中任何一个运行查询。

      • 走传统的关系数据库路线,有Member、Role和MemberRole连接表。使用 Spanner,您应该通过 Transaction 进行原子更新。查询时,您可能会遇到跨越多个拆分的读取问题,但您必须进行一些实际测试才能了解您的性能。

      【讨论】:

      • 感谢您的反馈。我被要求只使用 BigTable 或 Spanner。我已经研究过使用 Cloud Spanner,但我不知道 Spanner 将如何解决这个问题。基本上我正在寻找的是外键关系。如果我使用关联成员和角色的摇摆表,那么我可以利用该摇摆表来回答这两个查询。同样,我可以利用级联删除。 Spanner 不支持跨表的外键约束。 Spanner 使用 parent-->child 表来存储它。您能否提供一个示例来说明您使用 Spanner 讨论的内容?
      • 我将以我绝不是 Cloud Spanner 专家这一事实作为开头。由于 cmets 的大小限制,我将编辑上面的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2020-07-23
      • 2012-10-30
      • 2017-08-04
      • 1970-01-01
      • 2014-03-28
      相关资源
      最近更新 更多