標籤:
畢業設計寫了一個基於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++開發,對行業還是一知半解,希望大牛能為我指一條方向,好繼續努力!
基於SQLite的問卷調查系統的資料庫設計