我是新的谷歌应用程序引擎和谷歌数据存储(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')
谢谢!
我不明白你的问题更新。 “品种”如何适应层次结构?来自不同来源和/或酿酒厂的葡萄酒是否具有相同的品种?如果是这样的话,我认为这个品种必须是'Wine'模型的一个属性。我也不明白你的查询完成了我自己的示例查询不是。 – 2010-09-02 14:00:14