建模分层数据 - GAE

Posted

技术标签:

【中文标题】建模分层数据 - GAE【英文标题】:Modeling Hierarchical Data - GAE 【发布时间】:2010-09-01 16:23:23 【问题描述】:

我是 google-app-engine 和 google 数据存储区 (bigtable) 的新手,我对哪种顺序可能是设计所需数据模型的最佳方法有一些疑问。

我需要创建一个层次模型,就像产品目录一样,每个域都有一些深入的子域。目前,产品结构的变化小于读取要求。葡萄酒示例:

原产地(托斯卡纳、普里奥拉特、阿尔萨斯) 酒庄(只属于一个产地) 葡萄酒(仅属于一个酒庄)

所有的关系都是不相交和不完整的。此外,按照要求的顺序,我们可能需要为每种葡萄酒存储使用计数器(可能需要交易)

按照文档的顺序,似乎有不同的潜在解决方案:

祖先管理。使用父关系和事务 伪祖先管理。使用 db.ListProperty(db.Key) 模拟祖先 参考属性。明确指定类之间的关系

但是按照获取葡萄酒的预期请求顺序...有时按品种,有时按原产地,有时按酒厂...我担心使用这些结构的查询行为(例如关系模型。如果你要求一个家族的产品......你需要加入产品树中的最终深度限定符并加入家族)

也许最好创建一些重复的信息(按照google团队建议的顺序:操作很昂贵,但存储不是,所以重复的内容不应该是主要问题)

其他类似问题的一些回答建议:

将所有父 ID 存储为字符串中的层次结构......就像路径属性一样 复制 Drink 实体与树中所有父级之间的关系...

有什么建议吗?


你好,

正如您在第二个示例中所表示的那样,我们的案例更像是一种严格的分层方法。并且查询是用于检索产品列表,仅检索一个是不常见的。

我们需要从一个Origin、一个Winery或一个Variety中检索所有的葡萄酒(如果我们假设该品种是严格层次树的另一个节点,只是一个例子)

如您所述,一种方法可能是包含路径属性:

/origin/id/winery/id/variety/id

为了让我能够从一个品种中检索葡萄酒列表,应用如下查询:

wines_query = Wine.all()
wines_query.filter('key_name >','/origin/toscana/winery/latoscana/variety/merlot/')
wines_query.filter('key_name <','/origin/toscana/winery/latoscana/variety/merlot/zzzzzzzz')

或者像这样来自一个起源:

wines_query = Wine.all()
wines_query.filter('key_name >','/origin/toscana/')
wines_query.filter('key_name <','/origin/toscana/zzzzzz')

谢谢!

【问题讨论】:

我不明白你更新的问题。 Variety 如何融入层次结构?来自不同产地和/或酿酒厂的葡萄酒不会有相同的品种吗?如果是这种情况,我认为该品种只能是Wine 模型上的一个属性。我也不明白你的查询完成了什么,而我自己的示例查询没有。 【参考方案1】:

我不确定除了问题中提到的查询之外,您还需要执行哪些类型的查询,但是将数据存储在明确的祖先层次结构中会使您询问的查询很容易失效。

例如,要获取来自特定产地的所有葡萄酒:

origin_key = db.Key.from_path('Origin', 123)
wines_query = db.Query(Wine).ancestor(origin_key)

或从特定酒厂获取所有葡萄酒:

origin_key = db.Key.from_path('Origin', 123)
winery_key = db.Key.from_path('Winery', 456, parent=origin_key)
wines_query = db.Query(Wine).ancestor(winery_key)

并且,假设您将品种作为属性存储在 Wine 模型中,特定品种的所有葡萄酒都非常简单

wines_query = Wine.all().filter('variety =', 'merlot')

这种严格的分层方法的一个可能缺点是它可以强加给您的那种 URL 方案。层次结构看起来像

Origin -> Winery -> Wine

您必须知道葡萄酒原产地酒厂的密钥名称或 ID,才能构建检索该葡萄酒的密钥。除非您已经获得了葡萄酒键的字符串表示形式。这基本上迫使您拥有以下形式之一的葡萄酒 URL:

/origin/id/winery/id/wine/id /wine/opaque and unfriendly datastore key as a string

(当然,第一个 URL 可以用查询字符串参数替换;重要的是您需要三个不同的信息来识别给定的葡萄酒。)

不过,我可能没有想到这些 URL 方案还有其他替代方案。

【讨论】:

以上是关于建模分层数据 - GAE的主要内容,如果未能解决你的问题,请参考以下文章

数仓建模分层理论

《数据中台实战》:数据中台的分层建模体系

数据仓库的分层架构与演进

[hive]数仓分层|用户纬度拉链表|维度建模

如何在 RavenDB 等面向文档的数据库系统中对分层和关系数据进行建模?

Hive之数仓的分层及建模理论