2010-04-20 50 views
1

背景簡化寬,在Rails的非標準化表

我設計一個Rails應用程序記錄的研究數據。它大部分可以是概念化爲作爲「調查」(或「調查問卷」)數據。

我們已經有幾個Access數據庫和CSV文件來存放這些數據。現有的設計是每個調查都有自己的表,每個問題有一列。這些表中的很多都有100 +列。

我剛剛收到了所有調查總共有多少列的報告。計數是18,683。是的,18,683列 - lot超過我的預期。 (我認爲總共有一些列比列還多,有些表可能會退化,但我知道有幾個非常重要。)

爲了減少問題的複雜性,我一直在想我會讓某些型號

  • 調查
  • 問題
  • 響應

這一戰略將減少數Ò從數千到數十列的f欄。但是,我不知道如何通過Rails的做法,因爲:

  • 我們需要幾個調查美景(比autogenerating更好的形式)。
  • 我們需要驗證(有些調查很簡單,但其他調查很複雜)。
  • 我們需要將數據鏈接到其他記錄並且報告它。我的老闆會預期每個調查的結果爲,調整爲(例如每個問題一列),以便他們可以分析它。有沒有一個優雅的解決方案呢?
  • 存儲響應似乎比寬表(除非有一個好的策略「多態列」)。
  • ...和其他我可能想要將每個調查視爲ActiveRecord模型的情況。

問題

我如何可以簡化這個 「問題1,問題2,...,question143」 怪物?雖然我確定沒有完美的解決方案,但最好的選擇是什麼?

我會對備選數據庫感興趣,如果他們會讓事情變得更容易。我對文檔數據庫(如mongodb或couchdb)不是很熟悉,但從我所知道的情況來看,它們可能會有所幫助。

+0

這裏登陸的目的是希望進行相同類型的轉換,並好奇一年後你決定做什麼。 – wesgarrison 2011-08-09 18:29:53

+0

對於那個項目,我只是忍受所有的專欄。如果我今天要重新開始,我想我會做CouchDB或類似的東西。主要問題仍然存在,但這不是一個可怕的問題。 – 2011-08-10 00:29:18

回答

1

我認爲MongoDB會是很好的解決方案;它肯定值得你花時間去熟悉它。無模式會讓事情變得相當緩慢。例如,可以在每次調查中存儲的文件看起來像這樣:

survey = {:title => "Thoughts on X", 
      :questions => [ 
      {:text => "What year were you born?", 
      :type => "Fill in the blank", 
      }, 
      {:text => "Pick an option:", 
      :type => "multiple_choice", 
      :choices => ["a", "b", "c", "d"] 
      } 
      ] 
      } 

然後,您可以編寫能夠解釋這些調查文件,並介紹他們在網絡上的代碼。您當然可以在每個文檔中包含特殊驗證信息等。

單獨的集合可能包含用戶響應。您可以使用MongoDB的map-reduce進行聚合。

只是一些初步的想法。如果您決定探索這個方向,請跳到MongoDB用戶列表。