【问题标题】:Modelling a graph like entity relationship in app engine在应用引擎中建模类似实体关系的图
【发布时间】:2016-11-16 07:51:49
【问题描述】:

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

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

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

现在我的问题是,我可以在应用引擎数据存储中使用祖先查询对这种关系进行建模而不会导致索引爆炸吗?例如,我可以通过简单的查询找出项目中的故事。但是要找出分配给特定用户的故事需要遍历整个故事索引(这并不是真正的问题,因为查询性能与索引表大小无关),但是让查询反映图表不是更好吗喜欢这里的关系吗?好像是用 neo4j 之类的图数据库建模的?

【问题讨论】:

    标签: google-app-engine google-cloud-datastore data-modeling graph-databases


    【解决方案1】:

    如果用户可以处理多个故事,或者目前没有,和/或可以更改他们正在处理的故事(稍后被分配到不同的故事),那么将故事建模为“父”用户在语义层面上似乎大错特错——它也可能导致性能问题(取决于查询类型、读写频率等),但是,这是次要的担忧,我会关注语义首先是正确性,我不完全确定您的数据模型的具体语义。

    在 GAE 的数据存储中,父“关系”旨在模拟持久性(实际上我会说“永久”,就子实体的生命周期而言:-) 1:many 连接——尤其是一个很可能要求父母和孩子之间或兄弟姐妹之间的事务行为(甚至只是强一致性)(事务行为和强一致性并不是免费的,性能方面的——但是,当你需要它们时,你真的需要它们:-) .您的应用中的故事和用户之间的联系与此摘要的匹配程度如何?

    当然还有其他方法可以模拟持久性 1:许多连接;使用ndb 概念,StructuredProperty 实际上可以让您将“子”实体嵌入“在”“父”实体“内部”(如果您不需要查询子实体的属性,则可以通过使用 local 类型的结构化属性来提高速度)。

    当然,建模任何类型关系的最通用方法是使用KeyProperty——这不需要关系是持久的/永久的,也不一定是 1:many(例如,如果可以分配用户多个故事)。实际上,您可以将关键属性视为有向图中的边,其中实体是节点,具有完全的通用性(实际上它可以是一个 multi 有向图,从节点 A 到节点 B 有 0+ 条边,如果您需要比“单纯”图表所能提供的更多通用性:-)。但当然,如果您并不真正需要或使用它,您可以为如此广泛的通用性付出一些代价。

    最后,除了实体关系建模的完全清晰性(无论底层是哪种数据库,这都是一件好事:-),“模式”的选择(在最广泛的意义上:- ) 对于 NoSQL 数据库,强烈依赖于应用程序需要的查询、更新等,频率、延迟容忍度、事务性要求、一致性(强与最终)……比关系更高的程度我认为我们大多数人“咬牙切齿”的数据库。因此,我鼓励您努力使这两个方面都非常明确 - 当然是抽象的 E-R 层,但查询、更新、&c 以及它们的约束和要求的组合。

    【讨论】:

    • 谢谢。所以应用引擎祖先查询主要是为了强制一致性。您说得对,这里确实没有父->子关系。 Just possible 1:许多关系会发生很大变化。 StructuredProperty 可能不起作用,因为每个嵌入式实体都需要作为单独的模型。我相信KeyProperty 的想法最适合该应用程序。
    • (续)但是,这会对查询产生不利影响,因为可能需要 > 1 次获取(和写入)才能完全遵循关系。此外,还需要进行一些非规范化。事实证明这很难:)。 (抱歉回复太晚了:))
    • @abhink,同意可能需要一些 denorm 来优化性能(取决于查询、更新等的组合,我鼓励你说得非常明确!-)——这是典型的所有 NoSQL 数据库都存在问题,这是您为它们的可扩展性和效率付出的大部分代价。如果,正如您所说,关系“可以改变很多”,那么您要么使用 KeyProperty (+ 可能是一些 denorm),要么在发生此类更改时让自己接受大量复制(创建一个全新的实体来复制旧实体w/一个不同的父母,删除旧的)...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2023-04-03
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2019-04-17
    相关资源
    最近更新 更多