在 App Engine 中建模实体关系图

Modelling a graph like entity relationship in app engine

我有一个项目跟踪应用程序。该应用程序具有以下实体:

  1. 项目
  2. 故事 - 属于特定项目
  3. 用户 - 属于特定项目,分配给特定故事

每个 project 可以有多个 storyuser 实体作为后代。每个 story 可以是多个 user 实体的父级。基本上,每个项目都有几个用户可以处理项目中的各种故事(任务)。每个故事也可以分配多个用户。如下所示:

现在我的问题是,我能否使用祖先查询在 App Engine 数据存储区中对这种关系建模而不导致索引爆炸?例如,我可以通过简单的查询在项目中查找故事。但是要找出分配给特定用户的故事需要遍历整个故事索引(这并不是真正的问题,因为查询性能独立于索引 table 大小),但是拥有查询在这里反映了类似图表的关系?好像使用像 neo4j 这样的图形数据库建模?

如果用户目前可以处理多个故事,或者 none,and/or 可以随时更改他们正在处理的故事(稍后分配到不同的故事),然后将故事建模为用户的 "parent" 在语义层面上似乎是非常错误的——它也可能导致性能问题(取决于查询的类型、读写频率等),但是,这是相当次要担心,我会首先关注语义正确性,我不完全确定您的数据模型的特定语义。

GAE 的数据存储中的 parent "relationship" 旨在为持久性模型(实际上我会说 "permanent",就 child 实体的生命周期而言:-) 1:many 连接——尤其是那些可能需要 parent 和 child 之间或兄弟姐妹之间的交易行为(或者甚至只是强一致性)的连接(交易行为和强一致性不需要不是免费的,performance-wise -- 但是,当您需要它们时,您真的需要它们:-)。您的应用中的故事与用户之间的联系与此摘要的匹配程度如何?

当然还有其他方法可以对持久 1:many 连接进行建模;使用 ndb 概念,StructuredProperty 实际上可以让您 嵌入 "child" 实体 "inside" "parent" 一个(如果您不需要查询 child 的属性,您可以通过使用 local 类型的结构化 属性).

当然,对任何类型的关系建模的最通用方法是使用 KeyProperty——这不需要关系是 persistent/permanent,也不一定是 1:many (例如,如果可以将用户分配给多个故事)。事实上,您可以将关键属性视为有向图中的边,其中实体是节点,具有完全的普遍性(实际上它可以是 multi directed-graph,其中 0+ 个边来自节点 A 到节点 B,如果您需要比 "mere" 图可以提供的更通用:-)。但是,如果您真的不需要或不使用它,您当然可以为如此广泛的通用性付出一些代价。

最后,entity-relationship 建模完全清晰(无论底层是哪种数据库,这都是一件好事:-),"schema" 的选择(在最广泛的这个词的意义:-) 对于 NoSQL 数据库,它强烈依赖于应用程序将需要什么查询、更新和 c,以什么频率,对延迟的容忍度,事务性要求,一致性(强与最终),...比我认为我们大多数人 "cut our teeth on" 的关系数据库的程度更高。因此,我鼓励您努力使这两个方面都非常明确——当然是 E-R 抽象层,但是 查询、更新、&c 和对它们的限制和要求。