團隊專案——資料庫設計心得
一、專案簡介
該系統旨在設計一款基於聯邦型RDF資料庫的能充分理解使用者輸入關鍵詞語義的關鍵詞檢索引擎,通過構建索引以支援線上階段的關鍵詞檢索,理解使用者語義,讓使用者能自由表達自己的查詢需求,提供精準符合要求的答案,以精簡友好的介面、方便的操作為使用者提供一種資訊搜尋的快速定位的功能,特別是為區域網使用者提供更有針對性的、更方便的資源,從而提高資源的共享目標,讓使用者可以高效,快捷的獲得想要的資訊,區別於普通搜尋引擎,效果更加友好,方便快捷。
二、系統的功能描述
要想設計好資料庫,首先,我們應明確專案的需求,明確功能需求。
上圖為根據需求畫出的大致流程圖。
三、確定實體
通過對搜尋引擎各方面的分析,我們可以知道搜尋引擎中的實體包括:使用者,使用者組,模組,關鍵詞,結果。各實體包含的資料項分別如下:
(1)使用者:使用者id、使用者名稱、密碼、手機號、狀態、加入時間、上次登入 時間、上次登入地點、使用者組。
(2)使用者組:使用者組id、使用者組名稱。
(3)模組:模組id、模組名稱。
(4)關鍵詞:關鍵詞id、使用者id、關鍵詞、搜尋時間。
(5)結果:結果id、關鍵詞id、結果url、是否點選、點選時間。
另外,為了後期演算法方便,我們還將我們用到的資料集中的uri進行了編號,因為uri太長,如果不用編號的話,可能會很費時。
四、確定聯絡
通過以上分析,我們作如下規定:
(1)一個使用者可以屬於一個使用者組,一個使用者組可以包含多個使用者;
(2)一個使用者組可以繫結多個模組,一個模組可以被多個使用者組繫結;
(3)一個關鍵詞可以搜尋到多個結果,一個結果對應一個關鍵詞;
(4)一個使用者可以輸入多個關鍵詞,一個關鍵詞對應一個使用者;
實體之間的聯絡有:
(1)使用者與使用者組之間(M:1)
(2)使用者組與模組之間(M:N)
(3)關鍵詞與結果之間(1:M)
(4)使用者與關鍵詞之間(1:M)
五、最終設計結果
(1) 關鍵詞表(key_info表)
屬性名 |
資料型別 |
是否為空 |
含義 |
是否為主鍵 |
Key_id |
int |
not null |
關鍵詞id |
primary key |
User_id |
int |
not null |
使用者id |
Foreign key |
Keyword |
varchar(100) |
not null |
使用者輸入的關鍵詞 |
|
Search_t |
Datetime |
Not null |
搜尋時間 |
|
(2)圖結構表(schema_dir表)
屬性名 |
資料型別 |
是否為空 |
含義 |
是否為主鍵 |
Start |
Int |
not null |
起點 |
primary key |
End |
Int |
not null |
終點 |
Primary key |
Path |
Int |
not null |
路徑條數 |
|
(3)屬性表(pre_info表)
屬性名 |
資料型別 |
是否為空 |
含義 |
是否為主鍵 |
pre_id |
Int |
not null |
屬性編號 |
primary key |
pre_uri |
varchar(20) |
not null |
屬性uri |
|
(4)許可權表(power_info表)
屬性名 |
資料型別 |
是否為空 |
含義 |
是否為主鍵 |
User_id |
char(6) |
not null |
使用者編號 |
primary key |
privilege |
char(15) |
not null |
許可權名 |
primary key |
modifier |
Varchar(5) |
Not null |
修改人 |
|
modi_time |
datetime |
Not null |
修改時間 |
primary key |
(5)模組資訊表(module_info表)
屬性名 |
資料型別 |
是否為空 |
含義 |
是否為主鍵 |
module_id |
Int |
not null |
模組編號 |
primary key |
Module_name |
varchar(20) |
not null |
模組名 |
|
(6)使用者組與模組關係表(group_module_r表)
屬性名 |
資料型別 |
是否為空 |
含義 |
是否為主鍵 |
rela_id |
int |
not null |
關係編號 |
primary key |
group_id |
int |
not null |
使用者組id |
foreign key |
module_id |
int |
not null |
模組id |
foreign key |
(7)使用者組表(group_info表)
屬性名 |
資料型別 |
是否為空 |
含義 |
是否為主鍵 |
group_id |
int |
not null |
使用者組id |
primary key |
group_name |
varchar(10) |
not null |
使用者組名稱 |
|
(8)使用者表(usr_info表)
屬性名 |
資料型別 |
是否為空 |
含義 |
是否為主鍵 |
user_id |
varchar(5) |
not null |
使用者id編號 |
primary key |
user_name |
varchar(20) |
not null |
使用者賬號 |
|
password |
varchar(20) |
not null |
密碼 |
|
phone |
varchar(11) |
|
電話號碼 |
|
state |
bool |
not null |
登陸狀態 |
|
last_login_t |
datetime |
not null |
上次登陸時間 |
|
last_login_loc |
varchar(20) |
not null |
上次登陸地點 |
|
signup_t |
date |
not null |
註冊時間 |
|
group_id |
int |
|
使用者組id |
foreign key |
(9)結果表(result_info表)
屬性名 |
資料型別 |
是否為空 |
含義 |
是否為主鍵 |
res_id |
int |
not null |
結果id |
primary key |
keyword_id |
int |
not null |
關鍵詞id |
foreign key |
res_url |
varchar(300) |
not null |
搜尋結果url |
|
clickon |
bool |
not null |
是否被點選 |
|
clicktime |
datetime |
not null |
點選時間 |
|
(10)結點表(class_info表)
屬性名 |
資料型別 |
是否為空 |
含義 |
是否為主鍵 |
node_id |
int |
not null |
結點編號 |
primary key |
node_url |
varchar(255) |
not null |
結點url |
|
out_deg |
int |
not null |
結點出度 |
|
in_deg |
int |
not null |
結點入讀 |
|
node_rank |
int |
not null |
結點排序 |
|
六、心得
這次的資料庫設計,小組同學內部積極討論,積極提出意見,改進資料庫。在資料庫設計中,我們要考慮全面,先設計概念模型,然後生成物理模型。
在設計過程中要注意:
若兩個實體之間存在多對多的關係,則應消除這種關係。消除的辦法是,在兩者之間增加第三個實體。這樣,原來一個多對多的關係,現在變為兩個一對多的關係。要將原來兩個實體的屬性合理地分配到三個實體中去。這裡的第三個實體,實質上是一個較複雜的關係,它對應一張基本表。一般來講,資料庫設計工具不能識別多對多的關係,但能處理多對多的關係。