1

我正在研究使用Rails將調查存儲到數據庫的最佳方式。我已經檢查出這個偉大的Smerf Survey Plugin for Rails存儲調查到關係型數據庫具有以下表:在CouchDB與MySQL中存儲調查


smerf_forms: name, code 
smerf_forms_users: user_id, smerf_form_id, responses (as text) 
smerf_responses: smerf_forms_user_id, question_code, response (as text) 

在日誌中自帶Smerf一個基本的調查實例來看,有幾個數據庫調用:


Processing SmerfFormsController#create (for 127.0.0.1 at 2010-01-24 20:09:58) [POST] 
    Parameters: {"responses"=>{"g1q3a4s1"=>"", "g1q1a3s1a3s1"=>"", "g1q1"=>"1", "g2q1"=>{"1"=>"1"}, "g1q2"=>"2", "g1q3"=>{"1"=>"1", "2"=>"2", "3"=>"3"}, "g2q3"=>"12", "g1q4"=>["4"], "g1q5"=>["1", "3"], "g2q1a4s1"=>""}, "commit"=>"Press to Save your answers", "authenticity_token"=>"a4aDgvjzX0UK9HrQFdpdPyfALWGL22rcjRZfxDY3Ww0=", "smerf_form_id"=>"1"} 
    SmerfForm Load (1.0ms) SELECT * FROM "smerf_forms" WHERE ("smerf_forms"."id" = 1) 
    SmerfFormsUser Create (0.5ms) INSERT INTO "smerf_forms_users" ("responses", "smerf_form_id", "user_id") VALUES('--- !map:HashWithIndifferentAccess 
g1q3a4s1: "" 
g1q1: "1" 
g1q1a3s1a3s1: "" 
g1q2: "2" 
g2q1: !map:HashWithIndifferentAccess 
"1": "1" 
g1q3: !map:HashWithIndifferentAccess 
"1": "1" 
"2": "2" 
"3": "3" 
g1q4: 
- "4" 
g2q3: "12" 
g1q5: 
- "1" 
- "3" 
g2q1a4s1: "" 
', 1, -1) 
    SmerfResponse Create (0.2ms) INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('1', 1, 'g1q1') 
    SmerfResponse Create (0.1ms) INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('2', 1, 'g1q2') 
    SmerfResponse Create (0.1ms) INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('1', 1, 'g2q1') 
    SmerfResponse Create (0.1ms) INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('1', 1, 'g1q3') 
    SmerfResponse Create (0.3ms) INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('2', 1, 'g1q3') 
    SmerfResponse Create (0.1ms) INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('3', 1, 'g1q3') 
    SmerfResponse Create (0.1ms) INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('4', 1, 'g1q4') 
    SmerfResponse Create (0.1ms) INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('12', 1, 'g2q3') 
    SmerfResponse Create (0.1ms) INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('1', 1, 'g1q5') 
    SmerfResponse Create (0.1ms) INSERT INTO "smerf_responses" ("response", "smerf_forms_user_id", "question_code") VALUES('3', 1, 'g1q5') 
Rendering smerf_forms/edit 
Rendered smerf_forms/_smerf_form (11.0ms) 
Completed in 51ms (View: 17, DB: 3) | 200 OK [ http://localhost/smerf_forms] 

我的問題是,這將是替代關係數據庫更好地使用CouchDB的(一個面向文檔的數據庫)店的調查,因爲調查是比什麼都重要文件?沿着這些線是這些問題:

  • 是上述輸出沒關係,應該更優化?我的意思是,人們不會不斷地填寫調查出來,所以沒有必要對他們是快如閃電,所以我想知道如果CouchDB的實際上是任何更快
  • 它已經有了這個插件很好地建立,所以我應該只是使用它或者在CouchDB中使用它會是一個真正的好處。我想對這個調查數據做大量的分析(大量搜索,排序,加入......)。

感謝您的幫助。

仍在試圖繞到我的頭在何時何地使用CouchDB的:)

回答

3

我強烈山姆的意見分歧:

  • 調查和調查答覆是文件很好的例子。事實上,smerf從磁盤上的YAML文件加載表單定義,儘管我對smerf並不熟悉,但我猜smerf_forms_users.responses是一系列的答案。
  • 面向文檔的數據庫並不意味着無法分析數據。 CouchDB和MongoDB都具有提取和分析隱藏在文檔內部信息的機制。

另外,請注意,通過將表單定義序列化到YAML,問題和答案之間沒有任何連接,所以它可以說不是關係型解決方案。 (如果我爲此使用RDMBS,我會完全一樣 - 想象架構!)

在面向文檔的數據庫中,最有可能的是調查文檔(每個調查一個)和調查響應文檔(每個調查每個用戶一個)。簡單而乾淨。然而,儘管我認爲文檔數據庫會非常適合,但我同意Toby的評論,即如果農奴工作使用它,而不是增加額外的複雜性。

至於哪一個最好 - CouchDB vs MongoDB - 這部分是個人偏好和部分需求。

1

如果調查插件現在的工作,因爲是我會用它。

將另一個數據庫系統添加到您的應用程序將引入大量額外的工作...開發時間,以及部署和系統管理。除此之外,我只是認爲CouchDB不如一些替代品......我發現MongoDB更快更有用(特別的查詢實際上適用於開始)。 MogoDB現在還有一些優秀的Rails支持庫。

2

調查不是文件,它們是包含多組答案的問題集合。他們關鍵的一點是,當你進行調查時,你不想只存儲結果,而是分析它們。如果將結果視爲單個文檔,將會使分析變得困難。將數據存儲在關係數據庫中將簡化分析。

2

調查非常適合文檔數據庫。問自己的主要問題是:「將此存儲爲JSON會讓我的生活更輕鬆?」

Meebo使用CouchDB作爲調查響應等等。他們在CouchDB-Lounge集羣中存儲1.6億多個文檔。

@託比 - 這是一個權衡問題。藉助CouchDB,您可以獲得久經考驗的可靠性和可伸縮性,與任何其他數據庫都無法匹配的複製,並且全都通過HTTP。使用MySQL或Mongo,您可以爲少數用戶獲得快速結果,並可以使用某種形式的自動索引/查詢計劃。