目錄
一、實驗目的
l 瞭解環境監測系統的總體設計。
l 掌握系統數據庫設計。
l 熟悉數據庫連接和訪問。
l 熟悉系統功能模塊設計。
l 熟悉數據庫的存儲與讀取。
二、實驗示例
1.系統設計
對用戶的實時定位、環境檢測與預警顯示主要實現功能地圖顯示用戶的位置信息,同時地圖上顯示手機端的位置信息;周圍的溫度、溼度、煙霧濃度和天氣情況;關於溫度、溼度和煙霧濃度報警和對天氣、PM2.5等等的預警。
(1)系統功能需求
環境監測系統信息展示總表 |
|||||
當前時間 |
2018.06.17 |
00:00:00 |
|||
位置 信息 |
用戶位置1 |
XXX |
|||
用戶位置2 |
XXX |
||||
環 境 顯 示 |
位置1 |
溫度1 |
|
||
溼度1 |
|
||||
煙霧濃度 |
|
||||
位置2 |
天氣類型 |
|
|||
溫度2 |
|
||||
溼度2 |
|
||||
PM2.5 |
|
||||
預警 |
類型 |
當前值 |
閾值 |
備註 |
|
煙霧濃度 |
0 |
|
|
||
溼度 |
42 |
30 |
80 |
|
|
溫度 |
23 |
40 |
較舒適 |
||
PM2.5 |
103 |
100 |
輕度污染 |
||
管理 權限 |
賬號 |
||||
密碼 |
①用戶模塊。、
用戶模塊有登陸,查詢數據和添加、刪除預警信息等功能。
②管理員模塊。
管理員模塊有增刪查改。
本案例針對用戶模塊進行重點分析。
(2)數據庫需求分析
①用戶登錄數據流圖
用戶註冊主要是對註冊表的操作,用戶要完成註冊,需要將自己的信息插入到註冊表中,同時也提供用戶對自己的註冊欄進行查詢、修改和刪除功能。
圖1 用戶登錄數據流圖
②用戶查詢數據流圖。
用戶查詢數據主要分爲兩種類型,分別訪問到兩個數據表,可以對大範圍的環境情況進行查詢的外網數據表,也可以對具體到室內的環境數據進行查詢的傳感器數據表。
圖2 用戶查詢數據流圖
③用戶設置數據流圖
用戶對數據庫的數據沒有增加、刪除和修改的權限,只能夠對數據進行查詢和做出反饋。
圖3 用戶設置數據流圖
2、系統總體設計
(1)監測系統模塊設計
圖4 系統模塊設計
(2)系統數據庫設計
根據系統的功能需求,要對數據庫進行合理設計。在本系統設計過程中,首先要對數據庫進行需求分析,然後進行概念結構設計、邏輯結構設計、物理結構設計和數據庫實施等操作。
概念結構設計中,經分析得到以下各個局部E-R圖。
①用戶與賬戶E-R圖如圖所示。同一個用戶可以申請多個賬戶,但是同一個賬戶只能有一個用戶,所以用戶申請賬戶時,生成新的註冊表。
圖5 用戶與賬戶E-R圖
②用戶與環境E-R圖如圖所示。同一個賬戶可以有多個外網的數據,也可以有多個傳感器採集數據,同時同一個數據表亦可以爲多個用戶提供數據來源,所以在用戶查詢環境時,生成新的外網數據表和傳感器採集數據表。
圖6 用戶與環境E-R圖
③傳感器與熱點E-R圖如圖所示,一個傳感器可以搜索獲取多個熱點的信息,同一個熱點信號也可以被多個傳感器接收到,生成新的熱點數據表。
圖7 傳感器與熱點E-R圖
④合成用戶模塊整體E-R圖
圖8 合成用戶模塊整體E-R圖
在次只介紹用戶模塊中的幾個數據表。其整體描述如表1所示。
表1 各數據表描述
數據表 |
描述 |
log_info |
登錄表 |
Sensor_data |
傳感器採集數據表 |
Net_data |
外網數據表 |
AP |
室內定位熱點表 |
接下來,分別對各個數據表進行描述。
①log_info表
該表描述登錄的身份基本信息,包括用戶ID、用戶名、用戶密碼和系統。Log_info表的邏輯結構如表2所示。
表2 登錄表log_info
序號 |
字段名 |
標識 |
類型 |
長度/Byte |
精度 |
允許空 |
主鍵 |
1 |
user_id |
用戶ID |
int |
|
|
|
√ |
2 |
use_name |
用戶名 |
varchar |
10 |
|
|
|
3 |
use_pw |
用戶密碼 |
varchar |
10 |
|
|
|
4 |
system |
系統 |
varchar |
10 |
|
|
|
創建表2的語句如下。
drop table if exists "log_info";
/*==============================================================*/
/* Table: "log_info" */
/*==============================================================*/
create table "log_info"
(
"user id" int not null,
"user name" varchar(10),
"user pw" varchar(10),
system varchar(10),
primary key ("user id")
);
alter table "log_info" add constraint FK_Reference_1 foreign key ("user id")
②sensor_data表
該表描述傳感器採集數據信息,包括傳感器id、溫度、溼度和煙霧濃度的邏輯結構如表3所示。
表3 傳感器採集數據信息表sensor_data
序號 |
字段名 |
標識 |
類型 |
長度/Byte |
精度 |
允許空 |
主鍵 |
1 |
sensor_DT |
採集數據 |
Datatime |
|
|
|
√ |
2 |
temperature |
溫度 |
double |
10 |
2 |
|
|
3 |
humidity |
溼度 |
double |
10 |
2 |
|
|
4 |
ingredient |
煙霧濃度 |
double |
10 |
2 |
|
|
5 |
longitude |
經度 |
double |
10 |
6 |
|
|
6 |
latitude |
維度 |
double |
10 |
6 |
|
|
創建表3的語句如下。
drop table if exists "sensor_data";
/*==============================================================*/
/* Table: "sensor_data" */
/*==============================================================*/
create table "sensor_data"
(
Sensor_DT datetime not null,
temperature double(10,2),
humidity double(10,2),
ingredient double(10,2),
longitude double(10,6),
latitude double(10,6),
primary key (PI_DT)
);
ALTER TABLE `sensor_data` ADD CONSTRAINT `longitude` FOREIGN KEY (`longitude`) REFERENCES `ap` (`longitude1`) ON DELETE RESTRICT ON UPDATE RESTRICT;
ALTER TABLE `sensor_data` ADD CONSTRAINT `lagitude` FOREIGN KEY (`latitude1`) REFERENCES `ap` (`latitude1`) ON DELETE RESTRICT ON UPDATE RESTRICT;
③net_data表
該表描述了我們從互聯網上找到的數據信息表,包括id、溫度、溼度、PM2.5濃度、天氣類型、經度和緯度的邏輯結構如表4所示。
表4 外網數據信息表net_data
序號 |
字段名 |
標識 |
類型 |
長度/Byte |
精度 |
允許空 |
主鍵 |
1 |
net_DT |
外網數據 |
Datetime |
|
|
|
√ |
2 |
temperature |
溫度 |
double |
10 |
2 |
|
|
3 |
humidity |
溼度 |
double |
10 |
2 |
|
|
4 |
Pm2.5 |
Pm2.5 |
double |
10 |
2 |
|
|
5 |
longitude |
經度 |
double |
10 |
6 |
|
|
6 |
latitude |
維度 |
double |
10 |
6 |
|
|
7 |
Weather_type |
天氣類型 |
varchar |
10 |
|
|
|
創建表4的語句如下。
drop table if exists "net_data";
/*==============================================================*/
/* Table: "net_data" */
/*==============================================================*/
create table "net_data"
(
net_DT datetime not null,
pm2.5 double(10,2)
temperature double(10,2),
humidity double(10,2),
longitude2 double(10,6),
latitude2 double(10,6),
weather_type varchar(10),
primary key (net_DT)
);
④AP表
該表描述了我們的Access Point信息,用以室內的定位功能實現,包括熱點名、MAC地址、信號強度、精度和維度。AP表的邏輯結構如表5所示。
表5 熱點表AP
序號 |
字段名 |
標識 |
類型 |
長度/Byte |
精度 |
允許空 |
主鍵 |
1 |
APname |
熱點名 |
varchar |
|
|
|
√ |
2 |
macaddress |
MAC地址 |
varchar |
50 |
|
|
|
3 |
longitude |
經度 |
double |
10 |
6 |
|
|
4 |
latitude |
維度 |
double |
10 |
6 |
|
|
創建表5的語句如下。
drop table if exists AP;
/*==============================================================*/
/* Table: AP */
/*==============================================================*/
create table AP
(
APname varchar(10) not null,
macaddress varchar(50),
longitude double(10,6),
latitude double(10,6),
primary key (APname)
);
三、系統數據庫實現
(1)打開MySQL數據庫。
在DOS命令窗口輸入 mysql -hlocalhost -uroot -p回車 進入mysql數據庫,其中-h表示服務器名,localhost表示本地;-u爲數據庫用戶名,root是mysql默認用戶名;-p爲密碼,如果設置了密碼,可直接在-p後鏈接輸入,如:-p123456,用戶沒有設置密碼,顯示Enter password時,直接回車即可。注意,如果你的mysql沒有安裝在C盤下,你需要先使用DOS命令進入mysql的安裝目錄下的bin目錄中。以我的電腦爲例,方法如下:輸入D:進入D盤,在輸入cd D:\Works\MySQL5.5.25\bin進入到mysql的bin目錄下纔可以輸入 mysql -hlocalhost -uroot -p
圖9 打開MySQL數據庫
(2)MySQL 管理界面連接
Navicat for MySQL是一款強大的 MySQL 數據庫管理和開發工具,它爲專業開發者提供了一套強大的足夠尖端的工具,但對於新用戶仍然易於學習。Navicat for MySQL 基於Windows平臺,爲 MySQL 量身訂作,提供類似於 MySQL 的用管理界面工具。此解決方案的出現,將解放 PHP、J2EE 等程序員以及數據庫設計者、管理者的大腦,降低開發成本,爲用戶帶來更高的開發效率。
圖10 選擇“連接”對話框
(3)新建數據庫
①在Navicat導航視圖的左邊連接導航欄中的空白區域點擊右鍵就可以看到【新建數據庫】的命令,我們來建一個監測環境信息的數據庫:environ_inspector
圖11 新建數據庫
②【新建表】建完數據庫後接下來就是建用戶註冊表:log_info;
在建表過程中有一個地方要特別的注意,就是“欄位”,對於初次使用Navicat的新手來說,這個比較陌生,它的意思就是我們通常所說的“字段”,工具欄中的“添加欄位”即添加字段的意思,不要弄混了就成,添加完所有的字段以後要根據需求設置相應的“主鍵”。
圖12 新建用戶註冊表
圖13 新建net_data的SQL預覽
圖14 創建表的SQL語句方法
③建立數據庫完成。
圖15 各數據表
④查看圖表
圖17 模型圖表
四、將數據導入數據庫
(1)傳感器數據
①傳感器數據採集
圖18 傳感器數據採集
②數據導入數據庫
MySQLdb提供了connect方法用來和數據庫建立連接,接收數個參數,返回連接對象:
代碼如下:
conn=MySQLdb.connect(host="localhost",user="root",passwd="123456",db="environ_inspector",charset="utf8")
(2)外網數據
①數據爬取
爬蟲是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本,使用java Jsoup框架寫一個獲取天氣數據的爬蟲。
爬取網址:http://www.tianqi.com/ 天氣網
Jsoup框架優勢:
1.實現了CSS選擇器語法,頁面內容提取非常方便。
2.解析算法不使用遞歸,而是enum(枚舉)配合狀態模式遍歷數據(先預設所有語法組合),減少性能瓶頸。另外,不需要任何第三方依賴。
Jsoup獲取文檔分三個步驟。
1.根據輸入構建DOM樹
2.解析CSS選擇字符串到過濾表中
3.用深度優先算法將樹狀節點逐一過濾
②數據解析
通過網頁源碼獲取到網頁的dom結構,可以知道,我們需要的數據,主要都存在於 weather_info 這個類選擇器所在的節點當中,Jsoup 的document類提供了非常方便的解析方式,即類似於jqury 的複合選擇器。
圖19 獲取到的文檔
Selector選擇器概述
tagname: 通過標籤查找元素,比如:a
ns|tag: 通過標籤在命名空間查找元素,比如:可以用 fb|name 語法來查找 <fb:name> 元素
#id: 通過ID查找元素,比如:#logo
.class: 通過class名稱查找元素,比如:.masthead
[attribute]: 利用屬性查找元素,比如:[href]
[^attr]: 利用屬性名前綴來查找元素,比如:可以用[^data-] 來查找帶有HTML5 Dataset屬性的元素
[attr=value]: 利用屬性值來查找元素,比如:[width=500]
[attr^=value], [attr$=value], [attr*=value]: 利用匹配屬性值開頭、結尾或包含屬性值來查找元素,比如:[href*=/path/]
[attr~=regex]: 利用屬性值匹配正則表達式來查找元素,比如: img[src~=(?i)\.(png|jpe?g)]
*: 這個符號將匹配所有元素
圖20 解析獲取的數據
③數據存儲
調用上述conn數據接口將數據存入數據庫:
圖21 將外網數據導入數據庫
五、實驗心得體會
在當今信息化的社會裏,數據庫可以說已經融入到我們生活的方方面面中,如交通運輸、銀行金融、工商企業等等。只要有大量的數據要管理或者需要有大量數據支持的工作,都要使用到數據庫,它爲我們的生活帶來了便捷。
結合我所學習的內容,談談關於數據庫課程的總結。
我們首先從緒論瞭解了數據庫的概念,介紹了數據模型和三層模式數據庫。理解實體-聯繫方法,並學會繪製e-r圖。此外還應掌握概念數據模型的意義和傳統的三大數據模型,以及數據獨立性和數據庫三層模式結構。接着開始着重講述現在普遍使用的關係數據庫。包括關係數據模型的數據結構和基本術語,關係模型的完整性約束和關係代數運算。重點是關係模式完整性的分類和功能,以及關係代數中集合運算和關係運算。最後介紹了關係數據系統的三層模式結構。之後講述關係數據庫的標準語言sql的定義功能、查詢功能、操作和控制功能。重點在於數據查詢功能。另外還介紹了視圖的用法和動態sql中定義、操作和查詢功能。最後一章,介紹安全性,包括安全性措施的層次、數據庫管理系統的安全功能等,用戶管理和角色管理,權限管理。其他的安全問題包括:數據加密、審計、統計數據庫和用戶定義的安全性措施。介紹了事務的概念、性質以及sql對事務的支持。併發控制——干擾問題、可串行性、封鎖、死鎖、隔離級別、封鎖與隔離級別;恢復——故障類型、備份類型、日誌的概念、恢復模型、備份轉儲、還原。實驗課上,實際完成數據庫設計的過程,完善e-r模型中的概念,依賴關係,強制聯繫;主要掌握數據庫建立的步驟。
數據庫這一門課就要結束了,在老師的耐心教學和答疑中,這一學期的學習讓我收穫了很多,最後感謝老師的教導!