資料庫設計說明書
需要實作的功能
- 存儲使用者的相關資訊,包括使用者的郵箱、密碼、權限等級,還需要儲存使用者提出的問題和使用者回答的問題;
- 存儲問題相關資訊,包括問題的題目、較長的描述、提問使用者、問題的标簽、存在的答案、建立時間、最後一次修改時間,如果建立者标記了最佳答案,還需要進行辨別;
- 存儲回答相關資訊,包括回答的内容、回答使用者、建立時間、最後一次修改時間;
- 存儲标簽相關資訊,包括标簽名和标簽的描述;
- 一個使用者可以提出多個題目、做出多個回答,一個題目可以有多個回答;
- 一個題目可以有多個标簽,一個标簽也可以被多個題目使用;
- 【Beta新增】一個回答可以被多個使用者點贊,一個使用者可以點贊多個回答;
- 使用者删除後,其回答和題目仍舊保留,但是需要進行特殊辨別能夠識别到該問題/回答的建立者已經登出;
實體關系分析
簡單對上述要求進行抽象,可以得到如下
E-R圖
:

其中
使用者-題目
、
使用者-回答
關系并不是簡單的一對多關系,當原先的使用者被删除後,題目和回答應該可以單獨存在,即對應
個使用者。
為其添加便于查詢的
xID
屬性并标記主鍵後得到如下
E-R圖
由此,我們整理出所需的關系模式:
- 使用者(UID,email,密碼,昵稱,權限)
- 題目(QID,标題,建立者UID,詳細,最佳答案的AID,建立時間,修改時間)
- 回答(AID,所屬問題QID,内容,建立者UID,建立時間,修改時間)
- 标簽(TID,名稱,描述)
- 題目-标簽(TID,QID)
- 【Beta新增】點贊(UID,AID)
以上所有關系中除了最後一個都隻有第一個屬性是鍵。題目-标簽關系中,所有屬性共同構成主鍵,每一個主屬性都是外鍵。
關系模式限制
1. 使用者 user
屬性名 | 描述 | 基礎類型 | 額外限制 |
---|---|---|---|
UID | 使用者ID | int | 主鍵,由資料庫負責維護,遞增 |
使用者郵箱 | varchar(254) | 備用鍵,不能重複,不能更改 | |
bcrypt | 密文密碼 | char(len) | 由于目前沒有确定具體加密算法,是以資料庫密碼長度暫時未确定 |
name | 昵稱 | varchar(18) | 備用鍵,不能重複,2~18個字元 |
auth | 權限 | 1表示使用者,2表示管理者 |
2. 題目 question
QID | 題目ID | ||
title | 标題 | varchar(150) | 不超過150個字元 |
creater | 建立使用者 | 可空外鍵,應當是user關系中存在的UID,當對應的使用者被删除時,應由觸發器将此項置為空 | |
remarks | 詳細資訊 | varchar(max) | |
best | 最佳答案 | 可空外鍵,應當是answer關系中存在的AID,且該AID對應的回答的QID必須與本元組相同,當對應回答删除時,應由觸發器将此項值為空 | |
createTime | 建立時間 | date | 建立此項的時間,由資料庫維護,不可更改 |
modifyTime | 修改時間 | 每次修改此項應當更新,由資料庫維護 |
3. 回答 answer
AID | 回答ID | ||
所屬問題 | 不可空外鍵,當QID對應的問題删除後,此項也應當由觸發器删除 | ||
content | 回答内容 | varvhar(max) | |
4. 标簽
TID | 标簽ID | ||
名字 | varchar(16) | 不超過16個字元 | |
desc | 較長的描述 |
5. 題目-标簽
問題ID | 外鍵,當QID對應的問題删除後,此項也應當由觸發器删除 | ||
外鍵,當TID對應的标簽删除後,此項也應當由觸發器删除 |
6. 點贊
外鍵,當UID對應的使用者删除後,此項也應當由觸發器删除 | |||
外鍵,當AID對應的回答删除後,此項也應當由觸發器删除 |