我正在使用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数据存储和/或通用数据库设计相关的此方案的任何帮助或见解将不胜感激。我对数据库设计一般都很陌生,所以越有帮助越好。谢谢!
答案 0 :(得分:1)
我建议不要 - 而是使用外键。如果评论的产品为db.ReferenceProperty
以及撰写该产品的用户,您可以轻松获取产品的所有评论(Product.review_set.all()
),用户撰写的所有评论({{ 1}}),以及用于审核的产品和用户。