毕业设计写了一个基于Android的问卷调查系统,完成的只有离线部分,为了存储本地的一些数据设计了这个数据库。后来一个做Android开发的同学告诉我,Android项目一般不会把大量数据存储在本地。而在写毕业设计之前我几乎没有接触过Android开发,为了毕业设计,也只好硬着头皮这么做了,至于源码就不贴出来丢人了。这里主要介绍一下数据库的设计吧。希望和有兴趣的人共同讨论学习,本人对数据库比较感兴趣,虽然现在做的工作跟数据库不相关。
首先问卷调查系统得想办法把问卷存储下来,我的做法是用代码解析按照一定规则组织的文本,然后插入到数据库中。为了存储问卷我建了三张表。
title表,用来存储问卷的标题、描述信息和问卷的创建时间。有一个唯一标识id。建表语句如下:
CREATE TABLE [title] (
[t_id] integer PRIMARY KEY AUTOINCREMENT,
[t_title] varchar(50) NOT NULL UNIQUE,
[t_describe] TEXT,
[t_time] DATETIME NOT NULL);
结果如下:
question表,用来存储问卷中的问题内容以及该问题的类型(基本题型有单选题、多选题、判断题、填空题)。以及一个唯一标识id和参照title表的一个外键id,建表语句如下:
CREATE TABLE [question] (
[q_id] integer PRIMARY KEY AUTOINCREMENT,
[t_id] integer NOT NULL REFERENCES [title]([t_id]) ON DELETE CASCADE,
[q_context] text NOT NULL,
[q_type] integer NOT NULL,
UNIQUE([t_id], [q_context]));
结果如下:
item表,用来存储问卷中的问题选项,一个唯一标识id,参照title表的外键id,参照question表的外键id。建表语句如下:
CREATE TABLE [item] (
[i_id] integer PRIMARY KEY AUTOINCREMENT,
[q_id] integer NOT NULL REFERENCES [question]([q_id]) ON DELETE CASCADE,
[t_id] integer NOT NULL REFERENCES [title]([t_id]) ON DELETE CASCADE,
[i_context] text NOT NULL,
UNIQUE([q_id], [i_context]));
结果如下:
以上三张表基本上可以存储一张普通的问卷了,遇到有图片的问题或选项,我的做法是在问题内容或选项内容中用‘-’符号连接一张图片的名称,然后将图片存储在指定文件夹下,通过代码到该文件夹下加载图片。如果问题选项中有一个选项是“其他”或“其它”时,代码就认为该问题是带有填空的单选题或带有填空的多选题。这样题型就扩展到六种。
有了问卷,我还需要存储问卷调查结果。为了达到这一目的,我新建了另外两张表。
questionaire表,存储了调查问卷的创建时间,调查是否完成,是否上传的内容。还有一个标识id,以及参照title表的外键id,这连个id组成联合主键。建表语句如下:
CREATE TABLE [questionaire] (
[qn_id] integer NOT NULL,
[t_id] integer NOT NULL REFERENCES [title]([t_id]) ON DELETE CASCADE,
[qn_time] DATETIME NOT NULL,
[qn_completed] integer NOT NULL,
[qn_up] integer NOT NULL,
CONSTRAINT [sqlite_autoindex_questionaire_1] PRIMARY KEY ([qn_id], [t_id]));
结果如下:
answer表,用来存储问卷的调查结果。以及参照question表的外键id,参照item表的外键id,参照qustionaire表的联合外键id。建表语句如下:
CREATE TABLE [answer] (
[q_id] integer NOT NULL REFERENCES [question]([q_id]) ON DELETE CASCADE,
[t_id] integer NOT NULL,
[qn_id] integer NOT NULL,
[i_id] integer REFERENCES [item]([i_id]) ON DELETE CASCADE,
[context] text,
FOREIGN KEY([t_id], [qn_id]) REFERENCES [questionaire]([t_id], [qn_id]) ON DELETE CASCADE);
结果如下:
再贴一些SQL语句:
select t_id,t_title,t_describe,t_time from title order by t_id asc, 查找问卷标题。
select count(*) as c from questionaire where t_id = ?,‘?’号填充的是title表的标识id,用来统计该问卷下面对应有几项调查问卷。
select q_id,q_context,q_type from question where t_id = ? order by q_id asc ,‘?’号填充的是title表的标识id,用来查找该问卷中的所有问题内容。
select qn_id,qn_time,qn_completed,qn_up from questionaire where t_id = ? order by qn_id asc,‘?’号填充的是title表的标识id,用来查找该问卷对应的所有调查问卷的信息。
select i_id,i_context from item where q_id = ? and t_id = ? order by i_id asc,‘?’号依次填充的是question表的标识id和title表的标识id,用来查找一份问卷对应下面的问题对应的所有选项内容。
最后是顺利毕业了,另外本人现在从事的是c++开发,对行业还是一知半解,希望大牛能为我指一条方向,好继续努力!