如何组织应用程序数据库中的数据?

时间:2011-06-01 14:36:10

标签: google-app-engine google-cloud-datastore

我的应用程序应包含问题列表+用户答案。我该如何组织数据库:

             question1   question2   question2   ...         questionN
user_id_1    yes         no          yes         ...         yes
user_id_2    no          no          yes         ...         no
...
user_id_N    yes         yes         yes         ...         yes

看起来我需要创建带问题的单独表格并为每个问题分配ID。另一个表应该如何(因为列数不固定)?或者,我应该再增加两张桌子吗?

稍后我还需要:

  1. 计算 questionN ;
  2. 上有多少用户回答“是”
  3. * user_id_N *的多少朋友(另一个表或json数据)在 questionN 上回答'是'。
  4. 我应该每个查询数据库以获取这些数字,还是应该每次用户回答时都有单独的数据库并保留计数器(因为朋友列表可以随时更改,所以只查看项目1)。

3 个答案:

答案 0 :(得分:2)

执行此操作的标准方法是将每个答案存储为单独的实体 - 概念上与您描述的相同,但无需在添加新问题时修改结构。以下是实现此目的的一组示例模型定义:

class UserInfo(db.Model):
  # Anything you want to store about the user

class Question(db.Model):
  text = db.TextProperty(required=True)
  # Anything else you want to store about the question

class Answer(db.Model):
  user = db.ReferenceProperty(UserInfo, required=True)
  question = db.ReferenceProperty(Question, required=True)
  answer_text = db.TextProperty(required=True)

答案 1 :(得分:1)

如果您只存储所回答的内容,您应该能够使用3个表格进行存储。一个用于您的问题,一个到多个到一个表的答案,然后另一个表为用户提供一对多的答案。

答案 2 :(得分:1)

使用单独的表来跟踪问题本身可能是一个好主意。顺便说一句,如果您不是简单地为其留下标题,那么您的用户ID列表本身应该是答案表中的特定列。不过,使用单独的表来跟踪谁是谁的朋友可能是个好主意。

此外,虽然我没有访问GAE数据存储的经验,但至少使用SQL在单个列中计算特定答案是相当简单的。 SELECT COUNT(questionN) FROM AnswerTable WHERE questionN='yes'将是您用作SQL查询的内容。

请注意,如果您使用Limey的设计建议,则等效的SQL查询将更像SELECT COUNT(answer) FROM AnswerTable WHERE questionID='questionN' AND answer='yes'