舉例來說,今天我要建立一個存放動漫人物的資料表,一般人有可能會像下面這樣建立。
但是有些明顯重複性高的資料,在重複輸入的過程中,有可能會輸入錯誤。
或是在我們要將『SHOW BY ROCK!!』修改成『SB69』,那麼我們就必須要一筆一筆的修改。顯然這是沒有效率的事情。
而所謂的資料關聯,簡單的說,就是可以將不同資料表的資料,透過關聯的方式建立關係。因此,我們先將大量重複的資料,獨立移動到新的資料表中。
之後只要透過查詢語法,將擁有相同ID,但是在不同資料表中的資料,讓他們關聯起來,就可以顯示出一整張我們想要的資料表。但不同的是,我們只要修改『作品資料表』中的『作品名稱』,就可以一次修改成所有顯示出來的『SB69』作品名稱。
這樣根據索引鍵以及外來鍵,來繪製出資料表之間的關聯,也就是『資料模型』或是『資料關聯圖』。
附註:上面這些圖的表格,是使用EXCEL繪製的,並非真正的資料庫畫面。
而這樣拆分資料表的動作,一般稱之為『正規化』。『正規化』的部分,一般普遍只做到『第三正規化』,其中一個原因是做到第四第五正規化,資料表維護起來會十分複雜且困難。
至於『正規化』、『SQL資料庫語法』等等的部分,有興趣的人可以上網查資料。因為這部分說明起來,會花費相當多的版面,因此,未來有機會再來說。而且這部分,網路上的資料非常多,應該不難查到。
MySQL是一種資料庫軟體,屬於開源軟體,結構化查詢語言(SQL)是很常使用的標準化資料庫語言,MySQL是用C和C ++程式語言撰寫的。由於可靠、成本低、效能高,使之成為流行的資料庫開源軟體之一,而被廣泛應用在Internet中的各種中小型網站上。且也因為MySQL資料庫不斷成熟,逐漸有許多大規模的網站或其他軟體的應用,像是Google、Facebook、維基百科等網站。[19]
MySQL資料庫在水耕自動化系統中,不僅用來儲存感測器所測得的資料,也可以用來儲存使用者的排程、指令、帳密以及植物參數等資料。
在系統登入帳號時,程式會抓取帳號與密碼進行比對。以及在要進行自動監控的時候,系統也會抓取現在的環境參數,與資料庫中的植物生長參數等環境資料進行比對。在使用者要下達指令的時候,會將我們要系統進行的動作儲存到資料庫中,之後微電腦會抓取自料庫中的指令,並做出使用者要系統做出的動作。
除此之外,在進行自動監控的條件判斷時,所使用的判斷方法是MySQL內建的指令。因為若有非常多條件要判斷,甚至可能要執行迴圈,若是使用其他程式語言執行迴圈,不斷比對條件與判斷,可能會使得系統消耗大量資源與時間。因此使用MySQL語法進行條件判斷,會比使用程式跑回圈比對條件的效率還要高。
本系統當前的資料模型(資料關聯圖)
資料字典,也就是將資料表名稱、欄位名稱、資料型別、範例、索引鍵列表列出來。
欄位名稱有分成英文與中文,一般在系統中是使用英文的,因為若是使用中文欄位,在程式中可能會因為使用中文,而出現原因不明的BUG。
因此資料字典的中文欄位名稱,就是給人方便看而已,並沒有實質上的作用。
以下將附上系統的資料字典,當前系統雖然有進行修改,不過新版的系統架構與程式碼,未來有機會再公開。
以下開始放上系統的資料字典
使用者User資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
UserID |
使用者編號 |
INT |
1 |
P |
UserName |
使用者名稱 |
VARCHAR(20) |
王小明 |
|
AccountID |
帳戶編號 |
INT |
1 |
F |
帳戶Account資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
AccountID |
帳戶編號 |
INT |
1 |
P |
Account |
帳號 |
VARCHAR(30) |
abc1234 |
|
RoleID |
角色編號 |
INT |
1 |
F |
Password |
密碼 |
VARCHAR(20) |
pass1234 |
|
Memo |
備註 |
VARCHAR(50) |
|
|
IsDelete |
是否刪除 |
TINYINT |
0 |
|
角色Role資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
RoleID |
角色編號 |
INT |
1 |
P |
RoleName |
角色名稱 |
VARCHAR(20) |
系統管理員 |
|
Memo |
備註 |
VARCHAR(50) |
|
|
權限Competence資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
CompetenceID |
權限編號 |
INT |
1 |
P |
CompetenceName |
權限名稱 |
VARCHAR(20) |
系統管理員水耕控制 |
|
RoleID |
角色編號 |
INT |
1 |
F |
FunctionID |
功能編號 |
INT |
1 |
F |
OpenOrClose |
開啟關閉 |
TINYINT |
1 |
|
Memo |
備註 |
VARCHAR(50) |
|
|
功能Function資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
FunctionID |
功能編號 |
INT |
1 |
P |
FunctionName |
功能名稱 |
VARCHAR(20) |
水耕系統控制 |
|
FunctionIntroduction |
功能簡介 |
VARCHAR(30) |
對水耕系統的控制功能 |
|
Memo |
備註 |
VARCHAR(50) |
|
|
微電腦MCU資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
MCUID |
微電腦編號 |
INT |
1 |
P |
MCUName |
微電腦名稱 |
VARCHAR(20) |
Arduino1 |
|
MCUTypeID |
微電腦類型編號 |
INT |
1 |
F |
Memo |
備註 |
VARCHAR(50) |
|
|
IsDelete |
是否刪除 |
TINYINT |
0 |
|
微電腦腳位MCUPin資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
MCUPinID |
微電腦腳位編號 |
INT |
1 |
P |
MCUPinName |
微電腦腳位名稱 |
VARCHAR(20) |
Arduino1D1 |
|
MCUID |
微電腦編號 |
INT |
1 |
F |
PinTypeID |
腳位類型編號 |
INT |
1 |
F |
Memo |
備注 |
VARCHAR(50) |
|
|
微電腦類型MCUType資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
MCUTypeID |
微電腦類型編號 |
INT |
1 |
P |
MCUTypeName |
微電腦類型名稱 |
VARCHAR(20) |
Arduino |
|
MCUSpecification |
微電腦規格 |
VARCHAR(30) |
8bit 1.6GHz |
|
Memo |
備註 |
VARCHAR(50) |
|
|
設備廠商DeviceManufacturers資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
DeviceManufacturersID |
設備廠商編號 |
INT |
1 |
P |
DeviceManufacturersName |
設備廠商名稱 |
VARCHAR(20) |
|
|
ManufacturersTel |
電話 |
VARCHAR(12) |
|
|
Memo |
備註 |
VARCHAR(50) |
|
|
即時監控RTSurveillance資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
RTSurveillanceID |
即時監控編號 |
INT |
1 |
P |
RTSurveillanceName |
即時監控名稱 |
VARCHAR(20) |
抽水馬達 |
|
MCUPinID |
微電腦腳位編號 |
INT |
1 |
F |
SurveillanceGroupID |
即時監控群組編號 |
INT |
1 |
F |
DeviceID |
設備編號 |
INT |
1 |
F |
SurveillanceTypeID |
監控種類編號 |
INT |
1 |
F |
StatusTypeID |
狀態類型編號 |
INT |
1 |
|
SurveillanceStatus |
監控狀態 |
VARCHAR(20) |
1 |
|
Unit |
單位 |
VARCHAR(14) |
位元 |
|
CycleTime |
循環時間(秒) |
INT |
0 |
|
Memo |
備註 |
VARCHAR(50) |
|
|
設備店家DeviceShop資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
DeviceShopID |
銷售店家編號 |
INT |
1 |
P |
DeviceShopName |
銷售店家名稱 |
VARCHAR(20) |
中將電子 |
|
ShopTel |
電話 |
VARCHAR(12) |
(00)00000000 |
|
ShopAddress |
地址 |
VARCHAR(50) |
|
|
Memo |
備註 |
VARCHAR(50) |
|
|
設備Device資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
DeviceID |
設備編號 |
INT |
1 |
P |
DeviceName |
設備名稱 |
VARCHAR(20) |
抽水馬達 |
|
DeviceTypeID |
設備類型編號 |
INT |
1 |
F |
DeviceManufacturersID |
設備廠商編號 |
INT |
1 |
F |
DeviceShopID |
設備店家編號 |
INT |
1 |
F |
DeviceSpecification |
設備規格 |
VARCHAR(40) |
12V 600mA |
|
Memo |
備註 |
VARCHAR(50) |
|
|
排程Schedule資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
ScheduleID |
排程編號 |
INT |
1 |
P |
ScheduleName |
排程名稱 |
VARCHAR(20) |
植物燈開啟 |
|
ScheduleTypeID |
排程類別 |
INT |
1 |
F |
Date |
日期 |
DATE |
2017-12-25 |
|
Week |
星期 |
VARCHAR(13) |
1,3,5 |
|
Time |
時間 |
TIME |
09:30 |
|
IsOpen |
是否開啟 |
TINYINT(1) |
1 |
|
Memo |
備註 |
VARCHAR(50) |
|
|
排程動作ScheduleAction資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
ScheduleActionID |
排程動作編號 |
INT |
1 |
P |
ScheduleID |
排程編號 |
INT |
1 |
F |
DeviceID |
設備編號 |
INT |
1 |
F |
Status |
狀態 |
VARCHAR(20) |
255 |
|
自動條件AutoCondition資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
AutoConditionID |
自動條件編號 |
INT |
1 |
P |
AutoConditionName |
自動條件名稱 |
VARCHAR(20) |
火災警報 |
|
WeightsType |
權重類型 |
TINYINT(1) |
0 or 1(一次or直到解除) |
|
AutoCondition |
自動條件 |
TEXT |
|
|
Priority |
優先權 |
INT |
0表示不執行,其他表順序 |
|
LastStatus |
上次狀態 |
TINYINT(1) |
1(前一次條件是否符合) |
|
Memo |
備註 |
VARCHAR(50) |
|
|
自動動作AutoAction資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
AutoActionID |
自動動作編號 |
INT |
1 |
P |
AutoConditionID |
自動條件編號 |
INT |
1 |
F |
DeviceID |
設備編號 |
INT |
1 |
F |
Status |
狀態 |
VARCHAR(20) |
255 |
|
資料字典(參數設定資料表)
監控種類SurveillanceType資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
SurveillanceTypeID |
即時監控種類編號 |
INT |
1 |
P |
SurveillanceTypeName |
即時監控種類名稱 |
VARCHAR(20) |
環境、消防、保全 |
|
Memo |
備註 |
VARCHAR(50) |
|
|
腳位類型PinType資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
PinTypeID |
腳位類型編號 |
INT |
1 |
P |
PinTypeName |
腳位類型名稱 |
VARCHAR(20) |
Input、PWM、Analog |
|
Memo |
備註 |
VARCHAR(50) |
|
|
監控群組SurveillanceGroup資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
SurveillanceGroupID |
監控群組編號 |
INT |
1 |
P |
SurveillanceGroupName |
監控群組名稱 |
VARCHAR(20) |
主臥室、水耕系統 |
|
Memo |
備註 |
VARCHAR(50) |
|
|
設備類型DeviceType資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
DeviceTypeID |
設備類型編號 |
INT |
1 |
P |
DeviceTypeName |
設備類型名稱 |
VARCHAR(20) |
Sensor、IR |
|
Memo |
備註 |
VARCHAR(50) |
|
|
狀態類型StatusType資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
StatusTypeID |
狀態類型編號 |
INT |
1 |
P |
StatusTypeName |
狀態類型名稱 |
VARCHAR(20) |
OC、OO、Unit、% |
|
Memo |
備註 |
VARCHAR(50) |
|
|
排程類型ScheduleType資料表
欄位名稱 |
中文名稱 |
資料型別 |
欄位範例 |
索引鍵 |
ScheduleTypeID |
排程類型編號 |
INT |
1 |
P |
ScheduleTypeName |
排程類型名稱 |
VARCHAR(20) |
一次、每天、每周X、日期 |
|
Memo |
備註 |
VARCHAR(50) |
|
|
接下來這邊稍微解說一下,這些資料表的設計目的,並非單純只是存放資料而已。
首先,先來說最主要的功能之一,也就是即時監控。當使用者需要立刻開啟某設備,那麼使用者的指令會存入『即時監控RTSurveillance』資料表,的『監控狀態』欄位中。
那麼系統本身,到底該如何判斷,需要開啟哪個設備呢?所以我們就需要透過這些資料表告知系統。
例如:我現在要開啟植物燈,系統就必須知道,這個植物燈接在『XX微電腦』上的『OO腳位』。如此一來,我們可以直接透過手機開啟植物燈,系統就直接讓『XX微電腦』上『OO腳位』的『YY設備』通電。
接下來要說的是『自動條件判斷』功能的實現方法。完整的自動執行動作流程未來會在『Python自動監控程式』中提到。
現在只是先說,所謂的『自動條件』,也就是用來判斷條件是否符合的依據,是以SQL語法的形式,存放於『自動條件AutoCondition』資料表,的『自動條件』欄位中。
意思也就是說,當需要判斷條件時,我們會直接執行那個欄位中的SQL語法,執行SQL語法之後所得到的回傳數值,基本上是『0』或是『1』。如此一來,就可以將大量且複雜的判斷條件,直接由SQL資料庫來執行。這麼做的用意正如前面所提到的,可以讓速度更快節省效能。
參考資料
[2]Mysql.com,(n.d.)。Guide to Scaling Web Databases with MySQL Cluster。
文章目錄:
【系統開發】水耕自動化系統雛形(二)–資料庫
【系統開發】水耕自動化系統雛形(三)–PHP API
【系統開發】水耕自動化系統雛形(四)–NodeMCU
【系統開發】水耕自動化系統雛形(五)–Python自動監控程式
【系統開發】水耕自動化系統雛形(六)–Python排程程式
【系統開發】水耕自動化系統雛形(七)–APP即時監控
【系統開發】水耕自動化系統雛形(八)–
【系統開發】水耕自動化系統雛形(九)–
若是上面都看不懂的,可是依然想要實做看看,那也沒有關係!
後續會附上程式碼以及電路接線方法。
只要有辦法一一將系統環境建立起來,剩餘的部分程式碼貼上,我想應該都可以成功弄得出來的~ ?
後續文章將會列出系統所有的電路、接線、程式碼,不過文章更新速度可能會有些緩慢,還請有興趣的各位敬請期待。
若是各位有更好的建議與方法,也歡迎在留言區提出來跟大家討論喲~ ?
今天《夜雨的資訊小教室》就到這裡
大家下次見囉~ ?
據說在工程師之間流傳著一句話:
「你不解決掉BUG,BUG會解決掉你!」
羽奈:夜雨你看起來好矮......
夜雨:聽說是因為狐尾貓最近在趕繪圖作業,所以沒空畫出我的下半身。
羽奈:畫?你說甚麼?
夜雨:嘛!沒差啦。也許下次看到我就突然變高了~?
大家晚上好喵~我是狐尾貓~ (?>?<?)?