产品评论的GQL数据存储模型 - 密钥列表?还是祖先?

时间:2011-08-17 06:06:39

标签: database google-app-engine database-design google-cloud-datastore gql

我正在使用Google App Engine进行产品评论服务,我想知道构建数据存储模型的良好做法(我正在使用“高复制”设置,而且我已经按照你的方式收集了结构实体及其祖先非常重要)。特别是,我想知道如何使用密钥列表(或者如果我应该使用祖先/父母)。我的基本模型如下:

-------------        
-  Product  -
-------------       ----------
- [reviews] - ----> - Review -
-           -    /  ----------       -------------
-------------   |   - author - --->  -   User    -
                |   -        -       -------------
                |   ----------       - [reviews] - --|
                |                    -           -   |
                |                    -------------   |
                |                                    |
                --------------------------------------

如您所见,每个产品都包含一个评论列表,每个用户帐户还包含用户编写的评论列表。我的主要问题是关于这些评论列表,以及是否最好将它们存储为评论键列表,或者最好是使用查询动态生成它们。

对于与给定产品相关的评论列表,似乎最好的办法是将Review实体创建为给定产品的子项,然后创建列表我需要使用祖先查询时即时评论,例如:

reviews = db.GqlQuery("SELECT * "
                      "FROM Review "
                      "WHERE ANCESTOR IS :1 "
                      "ORDER BY date DESC LIMIT 10",
                       product_key)

但是,为了获得给定用户编写的评论列表,我想不出像上面那样做的方法。似乎我必须存储与用户编写的每个评论相关的密钥列表。它是否正确?如果是这样,在GAE数据存储区中存储密钥列表的最佳方法是什么?

对于与GAE数据存储和/或通用数据库设计相关的此方案的任何帮助或见解将不胜感激。我对数据库设计一般都很陌生,所以越有帮助越好。谢谢!

1 个答案:

答案 0 :(得分:1)

我建议不要 - 而是使用外键。如果评论的产品为db.ReferenceProperty以及撰写该产品的用户,您可以轻松获取产品的所有评论(Product.review_set.all()),用户撰写的所有评论({{ 1}}),以及用于审核的产品和用户。