1

我正在研究使用 Rails 将调查存储到数据库的最佳方法。我已经检查了这个很棒的Smerf Survey Plugin for Rails,它使用下表将调查存储到关系数据库中:


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,我会做同样的事情 - 想象一下架构!)

在面向文档的数据库中,很可能有调查文件(每个调查一份)和调查回复文件(每个用户每个调查一份)。简单干净。

然而,即使我认为文档数据库很合适,我也同意 Toby 的评论,即如果 serf 工作,使用它而不是增加额外的复杂性。

至于哪个是最好的——CouchDB 与 MongoDB——部分是个人喜好,部分是要求。

于 2010-01-25T12:40:36.190 回答
2

调查不是文件,它们是具有多组答案的问题的集合。他们的关键点是当你进行调查时,你不想只存储结果,而是分析它们。如果您将结果视为单个文档,则会使分析变得困难。将数据保存在关系数据库中将简化分析。

于 2010-01-25T03:55:17.057 回答
2

调查非常适合文档数据库。要问自己的主要问题是:“将其存储为 JSON 会让我的生活更轻松吗?”

Meebo 使用 CouchDB 进行调查回复等。他们在一个 CouchDB-Lounge 集群中存储了 160+ 百万个文档。

@Toby - 这是一个权衡问题。使用 CouchDB,您可以获得经过验证的可靠性和可扩展性,以及任何其他数据库都无法比拟的复制,而且这一切都通过 HTTP。使用 MySQL 或 Mongo,您可以获得少数用户的快速结果,以及某种形式的自动索引/查询计划。

于 2010-01-30T00:36:47.177 回答
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 回答