2011-06-01 64 views
0

我的應用程序應該包含問題列表+用戶答案。我應該如何組織數據庫:如何組織應用程序數據庫中的數據?

   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. * user_id_N *在問題N上回答'是'有多少朋友(另一個表或json數據)。

我應該每次查詢數據庫以獲取這些數字,還是應該有單獨的數據庫並在每次用戶應答時都保留計數器(因爲朋友列表可隨時更改,因此只能查看項目1)。

回答

1

如果您只是存儲回答的任何內容,則應該可以使用3個表格完成此操作。其中一個針對您的問題,一對多針對答案表,另一個針對針對一對多針對用戶提供的答案的針對表。

+0

請問您能否給我提供'一對多'表的示例?謝謝。 – 2011-06-01 15:06:32

+0

一對多表引用只是一個表中的一行可以被第二個表中的許多記錄通過一個外鍵引用(即第一個表的主鍵被存儲在該表的每個記錄的第二個表上)。 我認爲你應該在數據庫設計中查找一個簡介,在第三級標準化中進行閱讀。 – Limey 2011-06-01 15:23:33

+0

你能否給我提供「數據庫設計入門」的鏈接? – 2011-06-01 15:43:53

1

使用單獨的表格跟蹤問題本身可能是一個好主意。順便說一下,如果您不是簡單地爲它留下標題,則您的用戶標識列表本身應該是答案表中的特定列。儘管如此,使用單獨的表格來跟蹤誰是誰的朋友可能是一個好主意。另外,雖然我沒有經歷過訪問GAE數據存儲的經驗,但使用SQL對單個列中的特定答案進行計數相當簡單,至少。 SELECT COUNT(questionN) FROM AnswerTable WHERE questionN='yes'將會用作SQL查詢。

請注意,如果您使用Limey的設計建議,則等效的SQL查詢將更像SELECT COUNT(answer) FROM AnswerTable WHERE questionID='questionN' AND answer='yes'

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)