具有不同数据类型答案的调查的 SQL 设计

2023-12-04

我正在开展一项在线调查。大多数问题的答案等级为 1-5。如果我们需要向调查添加问题,我会使用一个简单的 Web 表单,该表单会插入到相应的表中,瞧!调查提出了新问题——没有新代码或对数据库结构进行更改。

我们被要求添加可以有不同数据类型答案的调查问题。规范是让调查“可配置”,以便在将来的任何时候,当有人说“我们需要一项新的调查来询问{文本答案问题}、{1-5 问题}、{真假问题} ,{以日期作为答案的问题}”,我们可以在不更改数据库结构的情况下做到这一点。

我试图想出存储这些答案的最佳方法,但我想出的每种方法似乎都有些老套。

有些问题可能有是/否或真/假答案,有些问题可能有整数答案(“过去一个月您使用过技术支持多少次?”),另一个答案可能有日期、字符串、倍数具有单个值的选择、具有多个值的多项选择等。或者有时,特定的答案值可能会提示子问题(“什么令您失望......?”)

简单的解决方案是将每个问题作为调查中的一栏,将其答案作为调查中的一栏,以及是否将其作为调查中的一栏进行询问。这对我来说感觉就像是一团乱——这是一张大桌子;不是很“相关”。

集思广益,我能想到的“最佳”方法是为每种答案类型使用不同的表,但这感觉容易受到数据完整性问题的影响。换句话说,我本来

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;

etc.

上述问题的一个问题是,我无法保证对于 DDL 中的任何问题至少存在一个且只有一个答案。

另一种解决方案可能是在问题表中为答案设置一个二进制或字符串列,并将所有答案编码为某种字符串或二进制格式,并将它们存储在答案列中。这为我的每一个问题提供了至少一个且仅有一个答案,但随后我就无法访问 SQL 查询中的聚合功能。我觉得这不是一个非常“相关”的解决方案。

因此,我认为上述想法存在问题。有没有“最好”的方法来解决这个问题?

现在我已经花时间来表达问题和我的想法了,看来我提出的广泛问题是“我想存储任意类型的数据而不进行任何编码......”是这样的吗?绝望?

我正在使用 MySQL,因此我无法访问其他 RDBMS 可能访问的内容。


使用指定答案类型的列,但将答案存储为文本。您的应用程序或前端可以使用answer_type 列来确定向最终用户显示的内容(测试框、单选按钮、日期选择器)以及如何在将其发送回数据库之前对其进行验证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有不同数据类型答案的调查的 SQL 设计 的相关文章

  • MySQL 5左连接未知列

    我有以下查询在 mysql 4 1 中工作 但在 5 0 中不起作用 SELECT FROM email e event email ee LEFT JOIN member m on m email e email WHERE ee ema
  • MySql 查询在选择中将 NULL 替换为空字符串

    如何用空字符串替换 select 中的 NULL 值 输出 NULL 值看起来不太专业 这是非常不寻常的 根据我的语法 我希望它能够工作 我希望能得到一个解释 为什么没有 select CASE prereq WHEN prereq IS
  • (SQL) 识别字段中字符串格式多次出现的位置

    我需要将叙述字段 自由文本 拆分为多行 目前的格式如下 Case Reference Narrative XXXX XX 123456 Endless Text up to 50k characters 在作为文本的叙述字段中 各个条目 当
  • MySQL 触发器和 SUM()

    我有两张桌子 学生桌和家庭桌 在学生中 我有列 st venue 和total venue 家里我有收入 Total Revenue 是学生 st 收入与家庭收入之和 其中 family id student student id stud
  • 选择MySql表数据放入数组中

    我尝试从 mysql 捕获数据并将它们全部放入数组中 认为 users table id name code 1 gorge 2132 2 flix ksd02 3 jasmen skaod2 sql mysql query select
  • 从存储过程中的动态 SQL 获取结果

    我正在编写一个存储过程 需要在过程中动态构造 SQL 语句以引用传入的表名称 我需要让这个 SQL 语句返回一个结果 然后我可以在整个过程的其余部分中使用该结果 我尝试过使用临时表和所有内容 但我不断收到一条消息 提示我需要声明变量等 例如
  • php 崩溃后 mysql 表被锁定

    我有一个 MySQL DB 和一个 innoDB 表 我有一个 php 页面 用于连接 锁定表 进行一些更新 然后解锁表 PHP 页面通过 wamp 与 apache 一起提供 php页面将文件上传到数据库 我决定通过上传一个大小大于分配给
  • PDO::commit() 成功或失败

    The PHP PDO 提交 http www php net manual en pdo commit php文档指出该方法成功时返回 TRUE 失败时返回 FALSE 这是指beginTransaction 和commit 之间的语句执
  • 如何将自定义类型数组传递给 Postgres 函数

    我有一个自定义类型 CREATE TYPE mytype as id uuid amount numeric 13 4 我想将它传递给具有以下签名的函数 CREATE FUNCTION myschema myfunction id uuid
  • PMA 4.5.2.0 file_exists():open_basedir 限制生效

    从 PPA 在我的 Ubuntu 服务器上安装 phpMyAdmin 后 https launchpad net nijel archive ubuntu phpmyadmin https launchpad net nijel archi
  • PreparedStatement setnull方法中Types.INTEGER和Types.NULL的区别

    下面的说法有什么区别 PreparedStatement setNull 1 java sql Types NULL and PreparedStatement setNull 1 java sql Types INTEGER 第一个指示驱
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • Laravel Sum 列数据库 Eloquent

    尝试获取我的一个表中 int 字段的总和应该非常容易 不幸的是 事实并非如此 因为无论我使用 Laravel MySQL 还是 Excel 我都会得到不同的结果 Laravel 5 4 给了我20506 Table sum field na
  • SQL - 为每条记录调用存储过程

    我正在寻找一种方法来为 select 语句的每条记录调用存储过程 SELECT SomeIds SELECT spro Id FROM SomeTable as spro INNER JOIN Address addr ON addr Id
  • 如果执行没有事务的删除语句,是否会删除部分内容?

    如果表myTable包含100000000条记录 我执行DELETE FROM myTable 没有开始交易并且出现问题 例如服务器电源故障 会删除一些记录吗 否 如果数据库引擎符合ACID http en wikipedia org wi
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • 在 Postgres 中的数组字段上应用聚合函数?

    是否可以对整数 字段 或其他数字数组 中的所有值应用聚合 如 avg stddev CREATE TABLE widget measurement integer insert into widget measurement values
  • 在 PHP 中将十进制/双精度/浮点值与 PDO 绑定的最佳方法是什么?

    看来类常量只涵盖PDO PARAM BOOL PDO PARAM INT and PDO PARAM STR用于绑定 您只是将十进制 浮点 双精度值绑定为字符串还是有更好的方法来处理它们 MySQLi 允许使用 d 类型表示 double
  • SQL Group BY,每个组的前 N ​​个项目

    我有一个 SQL 查询 可以获取给定商店中销量最高的 5 件商品 SELECT TOP 5 S UPCCode SUM TotalDollarSales FROM Sales S WHERE S StoreId 1 GROUP BY S U
  • Oracle:如果表存在

    我正在为 Oracle 数据库编写一些迁移脚本 并希望 Oracle 有类似于 MySQL 的东西IF EXISTS构造 具体来说 每当我想删除 MySQL 中的表时 我都会执行类似的操作 DROP TABLE IF EXISTS tabl

随机推荐

  • 如何将 js 模块导入 TypeScript 文件?

    我有一个量角器项目 其中包含这样一个文件 var FriendCard function card var webElement card var menuButton var serialNumber this getAsWebEleme
  • 定义一个指针来引用相同的变量名引用?

    在 Objective C 中 我真的无法理解这一点 void x x 我的理解是 声明一个泛型指针 因此类型为 void 指针变量名为 x 该指针指向变量的引用 应该已经声明了 但事实并非如此 名为 x 让我很困惑 判断该声明是否成立 v
  • 将 `__getattr__` 方法添加到现有对象实例[重复]

    这个问题在这里已经有答案了 我希望这个工作 import types def new getattr self args kwargs return 2 class A def init self pass a A a getattr ty
  • 使用 rowspan 时 IE 设置行高不起作用

    只是想知道为什么下面的 HTML 不起作用 基本上 当我在表行上设置 rowspan 时 IE 似乎会忽略我设置的高度 table border 1 cellpadding 0 cellspacing 0 width 100 tr td h
  • 如何在 HLSL 中使用巨大数组(错误 X4505)

    当我尝试编译时出现错误 X4505 临时寄存器和可转位临时寄存器的总和超出限制 共 4096 个 然而我的shader确实工作于特效作曲家 它崩溃的原因可能是因为我使用了一个非常大的数组 因为我使用的是行进立方体 const static
  • 如何修复我的 Android Soundboard 应用程序的“Google 移动广告 SDK 初始化不正确”问题

    将 Google 广告横幅添加到我的 Android Studio 项目不起作用 如果有人能帮助我 我将非常非常感激 我只是不明白我做错了什么 我遵循的教程是 https www youtube com watch v w7muIkMYE
  • 在 Android 中创建一个空位图并通过画布进行绘制

    我想创建一个空位图并将画布设置为该位图 然后在位图上绘制任何形状 这可能比您想象的更简单 int w WIDTH PX h HEIGHT PX Bitmap Config conf Bitmap Config ARGB 8888 see o
  • 换行符
    未按预期呈现

    知道为什么我的果岭上方有一条细细的灰线吗 and how to get rid of it Thanks https jsfiddle net Lc7gym88 hr border bottom 4px solid 469551 width
  • JTable自定义单元格渲染器焦点问题

    我有一张这样的桌子 第二列使用 JTextField 渲染器 第三列使用基于 JPasswordField 的渲染器和编辑器 看起来不错 但问题是我们必须输入值并且必须按 ENTER 在该图像中 我输入了密码 但没有按 Enter 键 因此
  • VB.NET 根据 XSD 文件验证 XML 文件并解析 xml

    我需要做什么 我需要根据 XSD 文件 传递文件路径 位置 验证 XML 文件 传递文件路径 位置 我需要检查它的格式是否正确 没有非法字符 并且它具有 XSD 中定义的所有标签 即没有丢失标签 它与 xsd 中定义的数据类型匹配 完成之后
  • ARM统一汇编语言语法和解析器?

    是否有 ARM 统一汇编语言的公开语法或解析器 如ARM 架构参考手册 A4 2 本文档使用 ARM 统一汇编语言 UAL 此汇编语言语法为所有 ARM 和 Thumb 指令提供了规范形式 UAL 描述了每条指令的助记符和操作数的语法 只是
  • 如何正确使用KeyPressEvent

    尝试为我的表单创建热键 code private void FormMain KeyPress object sender KeyPressEventArgs e if e KeyChar char Keys Enter MessageBo
  • 在 php 查询中连接 3 个表有困难

    我的数据库有 3 个表 我希望在选择查询中访问 但我似乎无法让它工作 从 2 个表中进行选择效果很好 所以我知道除了从 3 个表中进行选择的代码之外 其他一切都正常工作 我的数据库已在 PHPmyadmin 上创建 表格如下 论坛回复 re
  • 嵌入 Firebird 和 Entity Framework 6 时出现“未知数据类型”错误

    我使用的是嵌入式 Firebird 数据库 代码优先 实体框架 6 应用程序第一次运行时 它工作正常 创建数据库并插入数据 但此后每次运行时都会抛出以下异常 发生 System NotSupportedException 类型的异常 Fir
  • 为什么它停止并以退出代码 11 结束?

    我不知道为什么它停在那里并以退出代码 11 结束 它应该一直运行直到我发出命令 include
  • 根据 json 值路由到不同的操作

    我想根据特定 json 参数的值将请求路由到不同的操作 例如 给定以下 json 数据 type type1 type1data type1value and type type2 type2data type2value 我希望能够在我的
  • android AlarmManager 无法唤醒手机

    我想要在某个时间显示一个活动 为此 我使用 AlarmManager 当设备唤醒时它可以正常工作 但如果设备处于睡眠状态则不会唤醒它 我设置闹钟的代码 Calendar alarmTime Calendar getInstance alar
  • 为什么不评估 && 运算符的右侧? [复制]

    这个问题在这里已经有答案了 小疑问 为什么下面代码的输出是1 为什么不3 int i 0 boolean t true f false b b t i 0 b f i 2 gt 0 System out println i 条件与运算符 是
  • 在 MVC6 中创建自定义模型绑定器的正确方法是什么?

    我正在尝试按照中的步骤操作本文使用 vNext 项目和 mvc 6 我一直在阅读代码here但仍然有点不确定如何实现这一点 有没有人有一个可以分享的可行示例或为我指明正确的方向 我特别想知道如何注册自定义绑定器 以及我将从哪些类继承 因为
  • 具有不同数据类型答案的调查的 SQL 设计

    我正在开展一项在线调查 大多数问题的答案等级为 1 5 如果我们需要向调查添加问题 我会使用一个简单的 Web 表单 该表单会插入到相应的表中 瞧 调查提出了新问题 没有新代码或对数据库结构进行更改 我们被要求添加可以有不同数据类型答案的调