2010-09-01 117 views
5

我是新的谷歌应用程序引擎和谷歌数据存储(bigtable),我有一些疑问,可能是最好的方法来设计所需的数据模型。建模分层数据 - GAE

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

  • 原产地(托斯卡纳,贝利奥拉特,阿尔萨斯)
  • 酒厂(只属于一个产地)
  • 酒(只属于一个酒庄)

所有的关系是不相交并且不完整。此外,在要求顺序可能是我们需要(可能需要交易)

存储使用计数器逢酒在本文档的顺序似乎还有很不同的可能的解决方案:

  • 祖先管理。使用父母关系和交易
  • 伪祖先管理。使用db.ListProperty(db.Key)模拟祖先
  • ReferenceProperty。指定类别之间的关系

但按照预期的要求得到葡萄酒......有时是由品种,有时由来源,有时由酒厂......我担心查询的行为使用这些结构(如关系模型中的多个连接)如果您要求产品家族...您需要加入产品树中的最终深度限定符并加入家庭)

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

的其他类似的问题有些回复建议:

  • 商店所有父ID作为字符串中的一个层次......就像一个path属性
  • 复制的饮料实体之间的关系的所有的父母在树...

有什么建议吗?


威尔嗨,

我们的情况下,更多的是一种严格的分层方法,你在第二个例子中表示。而查询是用于检索产品列表,只检索一个不正常。

我们需要检索所有来自原产地的葡萄酒,从酿酒厂或来自不同(如果我们supose该品种是严格的分层树的另一个节点,仅是一个例子)

一种方法能是包括路径属性,如你所提到的:

  • /产地/ {ID} /酒厂/ {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') 

谢谢!

+0

我不明白你的问题更新。 “品种”如何适应层次结构?来自不同来源和/或酿酒厂的葡萄酒是否具有相同的品种?如果是这样的话,我认为这个品种必须是'Wine'模型的一个属性。我也不明白你的查询完成了我自己的示例查询不是。 – 2010-09-02 14:00:14

回答

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) 

,并假设你存储的品种葡萄酒模型上的一个属性,特定品种的所有葡萄酒都如此简单

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

On这种严格的分层方法可能存在的缺点是它可能会强加给你的那种URL方案。随着看起来像

Origin -> Winery -> Wine 

必须以建立一键检索葡萄酒了解葡萄酒的起源酒厂的键名或ID的层次结构。除非你已经有了葡萄酒钥匙的字符串表示。这基本上迫使你对葡萄酒的URL中的下列形式之一:

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

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

可能还有其他的替代品还没有发生,我这些URL方案,虽然。

+0

谢谢你,我按照你的回答顺序更新了问题。 – 2010-09-02 08:43:50