mysql - 历史表格数据的数据库设计与查询
问题描述
我有一组 HTML 表格,用于存储随时间推移的调查问题和回复。每个问题都有自己的 HTML 表格,列是年份,行是回复,然后各个单元格有当年的回复数量,如下所示:
我反复讨论了如何规范化这些数据并将其存储在数据库中,但我不确定最好的方法是什么。我正在寻找一个好的数据库模式,它可以随着时间的推移处理额外的问题、响应和年份。我也在寻找一个可以输出如下 HTML 表格的好查询。我可以在 PHP 循环中轻松地做到这一点,但我担心这对性能不利。
现在,我有以下表格设计:
问题
id int(11) unsigned AI PK
name varchar(255) UNQ
number varchar(255) UNQ
text
年
id int(11) unsigned AI PK
question_id int(11) unsigned FK
name varchar(255) UNQ (question_id + name)
回复
id int(11) unsigned AI PK
question_id int(11) unsigned FK
name varchar(255) UNQ (question_id + name)
数据
id int(11) unsigned AI PK
question_id int(11) unsigned FK
year_id int(11) unsigned FK
response_id int(11) unsigned FK UNQ (year_id + response_id)
count int(11) unsigned NULL
任何帮助或改进将不胜感激。
解决方案
一般来说,如果你有一个UNIQUE
键(这就是'UNQ'的意思吗??),使用 if 为PRIMARY KEY
.
“名称”通常不需要是VARCHAR(255)
. 选择较小的尺寸。
“数字”通常不需要是VARCHAR(255)
. 选择更合适的数据类型。
CREATE TABLE
用语法写你的模式;我在解析您的连续描述时遇到了严重问题。
“0.00”代表什么?它可以从其他数据中推导出来吗?如果是这样,请不要存储它。
从提供的第二张图片来看,我猜你有 1 张桌子:
CREATE TABLE foo (
year YEAR NULL,
gender ENUM('male', 'female') NOT NULL,
val SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY(year, gender)
) ENGINE=InnoDB;
我不明白“1959-1974”的含义,但它可能是
cohort VARHAR(20) NOT NULL
gender
并在另一个看起来像上表的表中替换。
但是......如果不了解将如何处理数据,您就无法真正设计模式。你有什么暂定的SELECTs
吗?
推荐阅读
- python - Heroku 访问我的本地 windows 目录
- mysql - 1:n 或 n:m,表关系
- macos - 如何在 MS Word 中应用一系列快捷键
- python - 如何创建封装 Python 代码的类似节点的 GUI(如 Simulink)?
- python - 将某些数据映射到 Django 中的模型
- java - bc-fips 库非法反射访问警告
- sql - 如何在 Hive 中查询最后 8 周的数据
- python - 如何在另一台服务器上的另一个 virtualenv 环境中运行 django 文件?
- html - 在上述列具有偏移量的 boostrap 行下方对齐内容
- javascript - 支付成功后如何调用函数?在角