纸质表格转换为数据库

3
我正在做一个Rails 3应用程序,用于替换公司的一份纸质表格。这张纸质表格跨越两页,包含大量的字段、复选框、下拉菜单等。
我在想如何在数据库中对其进行建模——一种方法是为表单上的每个字段在数据库中创建一个字段(当然要规范化)。这样会使添加或删除字段变得有些困难,因为需要进行迁移。另一种方法是做一些键值存储(不,MongoDB/CouchDB不是选项——必须使用MySQL)。使用键值存储将非常灵活,但查询起来会很麻烦。而且它将直接针对ActiveRecord?
有没有人有一个好的解决方案呢?
问候,
Jacob

你打算如何存储多个选择 - 比如:多选列表,给定问题的多个复选框? - OMG Ponies
这些属性最好存储为键值对,如果您有一个不错的接口,查询它们并不那么糟糕。此外,在处理复选框时要小心您的规范化...如果你有多值属性,甚至不在第一正规形式(1NF)中。 - rownage
无论哪种方式都有其代价。你必须决定是否愿意在复杂查询(键/值)或数据重构(逐个字段,规范化)方面付出代价。 - RobertB
@OMG Ponies:我认为可以将常量作为模型中的组合(以及数据库中的文本),并在具有外键的表格中,具体取决于客户需要管理选项的可能性。你有更好的建议吗? - jriff
@rownage:嗯?你能详细说明一下1NF部分吗? - jriff
2个回答

1

我建议您将最常见的属性建模为单独的数据库字段。一旦设置了尽可能多的字段,然后回退到使用键值设置来处理伪随机属性。我建议采用简单的方法,通过ActiveRecord方法serialize存储一个Hash。例如:

class TPS < ActiveRecord::Base
  serialize :custom, Hash
end

@tps = TPS.create(:name => "Kevin", :ssn => "123-456-789", :custom => { :abc => 'ABC', :def => )'DEF' })
@tps.name # Kevin
@tps.ssn  # 123-456-789
@tps.custom[:abc] # ABC
@tps.custom[:def] # DEF

TPS报告... 嘿嘿... 永远不会过时 - Upgradingdave
@Dave :) 显然这是一份实际的报告(测试程序规范)。虽然在《办公室空间》之前我从未听说过它。 - Kevin Sylvestre
哇 - 这似乎是一个非常好的方法。你如何查询自定义属性? - jriff

0
如果您的表单相对静态,那么可以为其创建一个模型,即使这似乎很基础,这也是一个合理的方法。表单如此复杂并不是您的错,您只是在考虑到这一点的情况下提出了解决方案。对此进行调整的迁移非常简单易懂。
将其拆分为键/值版本会更好,但需要更多的工程技术。如果您预计该表单将经常进行彻底的修订,则在这方面为未来构建可能更有意义。您可以在类似WuFoo的表单构建器中看到您可能想要构建的表单构建器的示例,但当然,构建表单构建器并不是轻而易举的事情。

我知道你的意思 - 我实际上很多年前就在ASP中做过一个简单的表单构建器。但是客户的预算不足以完成那么多的工作。但是如果表单发生了很大的变化,它可能不会出现在最初的版本中。 - jriff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接