我需要允许在我的软件中通过 Web 界面创建用户设计的表单。即,他们创建一个问题、一个类型(文本、单选框、复选框等)、选项(如果需要)(单选框/勾选框),然后添加,并继续此过程,直到他们在表单中创建了所有字段。
除了查看/填写/打印它们之外,不会对他们进行任何查询,即他们正在添加可以无限次填写的“问卷”(有些可能是 20 次,有些是数百万次)。
经过一些研究后,EAV 类型的解决方案似乎听起来不错,但对此有很多负面看法。许多人建议在这种情况下使用 NoSQL 数据库,但我并没有真正看到优势 - 您仍然拥有一个包含许多字段的表单,然后是包含许多字段的结果。
某些字段 (text/text_area/date) 可能只有一个值,但许多字段也有多个选项(单选按钮、选择下拉菜单、复选框)。
这是传统 SQL 中的示例设计:
形式:creator_id,姓名
form_field: form_id, order, question, type (text, text_area, date, radio, select, check)
form_field_option: form_field_id, name, value, order(这个用于radio/select/check)
form_result:form_id,application_id(不是我使用的名称,但所有结果都属于“应用程序”)
form_field_value: form_result_id, form_field_id, form_field_option_id, value(如果选项字段的值将为空,文本字段 form_field_option_id 将为空)
据此构建表单并获得结果似乎相当容易。它可能完全有效也可能不完全有效,但假设一个典型的形式是 5-30 个问题,会那么糟糕吗?
将其放入 NoSQL 数据库(即 Mongo 或类似数据库)中有什么优势吗?如果是这样,你能给我具体的例子来说明它们是什么并给我一个样本设计吗?我见过很多答案,例如“NoSQL 更适合这个”,但我在这方面没有经验,是因为更快地检索结果,还是什么?使用 NoSQL 会带来哪些缺点?
谢谢
最佳答案
MongoDB 可能比关系数据库更适合这个应用程序。您的基本实体(表单设计和表单结果)是有效的文档,其内容本质上绑定(bind)在一起,即表单字段在其父表单的上下文之外毫无意义。
MongoDB 允许您将这些文档分别存储为单个结构,而不是像在关系数据模型中那样分散在各种表中。
这是 YAML,因为它比 JSON 更简洁。底层结构将是相同的。
_id: 12345
creator: Adrian
name: NoSQL form demonstrator
fields:
- id: first_name
label: First name
type: text
required: true
- id: last_name
label: Last name
type: text
required: true
- id: dob
label: Date of birth
type: date
- id: bio
label: Biography
type: textarea
- id: drink
label: What would you like to drink?
type: select
options:
- id: tea
label: Tea
- id: coffee
label: Coffee
- id: beer
label: Beer
- id: water
label: Mineral water
- id: mailing_list
label: Join our mailing list?
type: check
default: false
注意:
您只需将键存储在需要的地方,而不是像在关系数据库中那样为每个上下文中的每个事物都设置一个列。例如不需要 required: false —— 如果这是默认设置,那么就不要使用它。
MongoDB 文档具有内在的顺序,因此无需在表单设计中创建字段来保存字段的顺序。
表单结果将以相同的方式存储。只需按照您的预期自然存储它们即可:
_id: 545245
form_id: 12345
name: NoSQL form demonstrator
results:
- id: first_name
label: First name
type: text
value: Adrian
- id: last_name
label: Last name
type: text
value: Short
- id: dob
label: Date of birth
type: date
value: 1970-01-01
- id: bio
label: Biography
type: textarea
value: Doing things on the internet
- id: drink
label: What would you like to drink?
type: select
value: Tea
- id: mailing_list
label: Join our mailing list?
type: check
value: false
关于mongodb - 用于用户设计表单的数据存储 - NoSQL 对 EAV 的任何优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11318563/
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。