首页 > 解决方案 > 历史表格数据的数据库设计与查询

问题描述

我有一组 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

任何帮助或改进将不胜感激。

标签: mysqldatabasedatabase-design

解决方案


一般来说,如果你有一个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吗?


推荐阅读