我正在进行在线调查。大多数问题的答案等级为 1-5。如果我们需要在调查中添加一个问题,我会使用一个简单的 Web 表单,它会在适当的表中执行 INSERT,瞧!调查提出新问题 -- 没有新代码或对数据库结构的更改。
我们被要求添加可以有不同数据类型答案的调查问题。规范是让调查“可配置”,这样在未来的任何时候,当有人说,“我们需要一个新的调查,问{text answer question},{1-5 question},{true false question} , {以日期作为答案的问题}”,我们可以在不更改数据库结构的情况下做到这一点。
我正在努力想出存储这些答案的最佳方式,但我想出的每一种方法似乎都有些老套。
有些问题可能有是/否或真/假答案,有些可能有整数答案(“过去一个月您使用过多少次技术支持?”),另一个答案可能有日期、字符串,具有单个值的多项选择,具有多个值的多项选择等。或者有时,特定答案值可能会提示一个子问题(“What disappointed you about...?”)
简单的解决方案是将每个问题作为调查中的一列,将其答案作为调查中的一列,以及是否将其作为调查中的一列。这对我来说感觉很乱——一张大 table ;不是很“相关”。
集思广益,我能想出的“最佳”方法是为每种答案类型使用不同的表格,但这感觉容易受到数据完整性问题的影响。换句话说,我会
CREATE TABLE `Questions` (...);
CREATE TABLE `TrueFalseAnswers` (...);
ALTER TABLE `TrueFalseAnswers`
ADD CONSTRAINT `TrueFalseAnswers_ibfk_1` FOREIGN KEY (`question_id`)
REFERENCES `Questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
CREATE TABLE `TextAnswers` (...);
ALTER TABLE `TextAnswers`
ADD CONSTRAINT `TextAnswers_ibfk_1` FOREIGN KEY (`question_id`)
REFERENCES `Questions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
等等
上述内容的一个问题是,我无法保证仅 DDL 中的任何问题至少存在一个且只有一个答案。
另一种解决方案可能是在 Questions 表中为答案设置一个二进制或字符串列,并将所有答案编码为某种字符串或二进制格式,并将它们存储在答案列中。这为每个问题至少提供了一个且只有一个答案,但随后我无法访问 SQL 查询中的聚合功能。这让我觉得这不是一个非常“相关”的解决方案。
因此,我发现上述想法存在问题。有解决这个问题的“最佳”方法吗?
既然我已经花时间表达了这个问题和我的想法,那么我提出的广泛问题似乎是“我想存储任意类型的数据而不进行任何编码...... "这是没有希望了吗?
我正在使用 MySQL,所以我无法访问其他 RDBMS 可能访问的内容。
最佳答案
使用指定答案类型的列,但将答案存储为文本。您的应用程序或前端可以使用 answer_type 列来确定要向最终用户显示的内容(测试框、单选按钮、日期选择器)以及如何在将其发送回数据库之前对其进行验证。
关于mysql - 用于不同数据类型答案调查的 SQL 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1764469/
我有一个模型: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
我主要使用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
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我已经在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标准库是否已经带有这样一个类? 最佳
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain