1

Railsを使用して調査をデータベースに保存するための最良の方法を検討しています。次の表を使用して、調査をリレーショナルデータベースに格納するRails用のこの優れたSmerfSurveyPluginを確認しました。


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をいつどこで使用するか頭を悩ませようとしています:)

4

5 に答える 5

3

私はサムのコメントに強く反対します:

  • 調査と調査回答は、ドキュメントの優れた例です。実際、smerfはディスク上のYAMLファイルからフォーム定義をロードします。私はsmerfにまったく精通していませんが、smerf_forms_users.responsesはシリアル化された回答のセットであると推測しています。
  • ドキュメント指向のデータベースは、データを分析できないことを意味するものではありません。CouchDBとMongoDBはどちらも、ドキュメントの奥深くに埋め込まれた情報を抽出して分析するためのメカニズムを備えています。

また、フォーム定義をYAMLにシリアル化することで、質問と回答の間に関係がなくなるため、リレーショナルソリューションではないことに注意してください。(これにRDMBSを使用している場合も、まったく同じことを行います。スキーマを想像してください!)

ドキュメント指向のデータベースでは、調査ドキュメント(調査ごとに1つ)と調査回答ドキュメント(調査ごとにユーザーごとに1つ)が存在する可能性があります。シンプルでクリーン。

ただし、ドキュメントデータベースが適していると思いますが、農奴が機能する場合は複雑さを増すのではなく、それを使用するというTobyのコメントに同意します。

CouchDBとMongoDBのどちらが最適かについては、一部は個人的な好みであり、一部は要件です。

于 2010-01-25T12:40:36.190 に答える
2

調査はドキュメントデータベースに最適です。自問する主なことは、「これをJSONとして保存すると、私の生活が楽になるでしょうか?」です。

Meeboは、とりわけ調査回答にCouchDBを使用しています。1億6000万以上のドキュメントをCouchDB-Loungeクラスターに保存します。

@Toby-それはトレードオフの問題です。CouchDBを使用すると、実証済みの信頼性とスケーラビリティ、他のどのデータベースにも匹敵しないレプリケーションを実現でき、すべてHTTPを介して行われます。MySQLまたはMongoを使用すると、少数のユーザーに対して高速な結果が得られ、何らかの形式の自動インデックス作成/クエリプランニングが得られます。

于 2010-01-30T00:36:47.177 に答える
2

調査はドキュメントではなく、多くの回答が含まれる質問のコレクションです。重要な点は、調査を実行するときに、結果を保存するだけでなく、分析することです。結果を1つのドキュメントとして扱うと、分析が困難になります。リレーショナルデータベースにデータがあると、分析が簡単になります。

于 2010-01-25T03:55:17.057 に答える
1

調査プラグインが機能するようになれば、そのまま使用します。

アプリに別のデータベースシステムを追加すると、多くの余分な作業が発生します...開発時間に加えて、展開とシステム管理。

これに加えて、CouchDBがいくつかの選択肢ほど優れているとは思いません... MongoDBの方が高速で便利であることがわかりました(実際に開始するために機能するアドホッククエリ)。MogoDBには、Rails用の優れたサポートライブラリもいくつかあります。

于 2010-01-25T03:45:53.413 に答える
0

Zodiac.NETは、調査を保存する良い例です。調査定義にXMLを使用します。

http://www.mentor-logic.com/index.php/products/components/zodiacnet

于 2010-02-15T13:42:37.753 に答える