本講我們來理清思路,如何把大數(shù)據(jù)思維融入畢業(yè)設(shè)計里面,。
首先,,前提是你已經(jīng)知道了一個軟件項目的制作,比如“基于分布式存儲的學生檔案管理系統(tǒng)”,、“基于分布式計算的圖書管理系統(tǒng)”,、“基于網(wǎng)絡(luò)爬蟲的個性化新聞推薦系統(tǒng)”,首先你要理解了學生檔案管理系統(tǒng),、圖書館管理系統(tǒng),、新聞推薦系統(tǒng)怎么寫,然后才是如何加入大數(shù)據(jù)相關(guān)的技術(shù)點,。
下的內(nèi)容的視頻版本可以看騰訊課堂上的,,地址:https://ke.qq.com/course/2962343
一、畢業(yè)設(shè)計項目分類
所以,,根據(jù)我們的畢業(yè)設(shè)計題目,,主要分三個方向:
1、基于分布式存儲的XXX系統(tǒng),;
2,、基于分布式計算的XXX系統(tǒng),;
3、基于網(wǎng)絡(luò)爬蟲的XXX系統(tǒng),。
二,、系統(tǒng)架構(gòu)
首先,什么是系統(tǒng)架構(gòu),,系統(tǒng)構(gòu)架是對已確定的需求的技術(shù)實現(xiàn)構(gòu)架,抽象來說,,它是某個系統(tǒng)的體系結(jié)構(gòu),它確定一個系統(tǒng)的硬件或軟件之間的連接,。
系統(tǒng)架構(gòu)設(shè)計模型主要有邏輯架構(gòu),、功能架構(gòu)、數(shù)據(jù)架構(gòu),、物理架構(gòu)和運行架構(gòu)等模型圖,。系統(tǒng)架構(gòu)就是一些模型圖,模型圖是人們用來理解系統(tǒng)和溝通的工具,。這些模型圖需要提供給與這個系統(tǒng)相關(guān)的人來理解系統(tǒng),,系統(tǒng)相關(guān)的人有項目經(jīng)理、產(chǎn)品經(jīng)理,、開發(fā)人員,、系統(tǒng)運營維護人員、客戶,、項目投資人等,。這些人有不同的知識背景,對同一架構(gòu)模型圖也會有不同的認知和理解:如果把開發(fā)架構(gòu)模型圖給產(chǎn)品經(jīng)理或客戶看,,他們定然看不懂也不能理解,;同樣的道理,如果只把邏輯架構(gòu)圖給開發(fā)人員看,,就不能正確地指導(dǎo)開發(fā)人員構(gòu)建開發(fā)環(huán)境,。
因此我們(此時我們就是架構(gòu)設(shè)計師)在進行系統(tǒng)架構(gòu)設(shè)計時,需要從系統(tǒng)的不同維度進行設(shè)計,,以滿足系統(tǒng)相關(guān)人理解系統(tǒng)架構(gòu)的需求,。其中數(shù)據(jù)架構(gòu)模型一般放在數(shù)據(jù)庫中進行設(shè)計,運行架構(gòu)和物理架構(gòu)基本相近,,只是在物理架構(gòu)中加了數(shù)據(jù)的流向,,因此一些系統(tǒng)設(shè)計使用物理架構(gòu)代替了運行架構(gòu)。
我們在論文里面只需要些物理架構(gòu)(物理設(shè)計)或者邏輯架構(gòu)(邏輯設(shè)計),、功能架構(gòu)(功能設(shè)計),、數(shù)據(jù)架構(gòu)(數(shù)據(jù)設(shè)計)即可。
2.1邏輯架構(gòu)
邏輯架構(gòu)是系統(tǒng)(程序)的運行模式,,如:層次結(jié)構(gòu),,調(diào)用關(guān)系,。比如下面的分層:
2.2物理架構(gòu)
物理架構(gòu)就是基礎(chǔ)架構(gòu)的設(shè)計規(guī)劃,例如:OS,,硬件,,網(wǎng)絡(luò),各種應(yīng)用服務(wù)器之間的規(guī)劃,。如下面這個圖:
2.2.1常見物理架構(gòu)
所以,,最簡單的物理架構(gòu)包括有:用戶端-網(wǎng)絡(luò)-服務(wù)器端(應(yīng)用服務(wù)器-數(shù)據(jù)庫服務(wù)器)。如下所示:
如上所示,,常見的系統(tǒng)服務(wù)器端里面都是應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器分開,,通過局域網(wǎng)連在一起,,最終數(shù)據(jù)經(jīng)過防火墻,。用戶端可以簡單的是web端,,如果有安卓端的也可以寫上APP。
2.2.2基于分布式存儲的物理架構(gòu)
如果在基于分布式存儲的,,就是多了一個分布式存儲的服務(wù)器,這個服務(wù)器可以是采用偽分布式的,,也可以采用完全分布式的,,如下圖所示則為偽分布式的:
如下圖所示則為完全分布式的(HDFS由一個NameNode和2個DataNode組成):
當然,論文的這個“系統(tǒng)架構(gòu)”有了圖還是不行的,,還需要相對詳細的文件描述,。比如上一個圖片,那么可以這樣簡單描述:
本系統(tǒng)的架構(gòu)如上圖所示,,采用的是B/S框架,,客戶端支持電腦端及安卓手機端。服務(wù)器端由應(yīng)用服務(wù)器,、數(shù)據(jù)庫服務(wù)器,、分布式存儲的HDFS集群組成,其中,,HDFS集群包括一個NameNode節(jié)點,,兩個DataNode節(jié)點。數(shù)據(jù)庫服務(wù)器用于存儲結(jié)構(gòu)化數(shù)據(jù),,HDFS集群用于存儲非結(jié)構(gòu)化數(shù)據(jù),,如圖片、音視頻,、文件等,。
2.2.3基于分布式計算的物理架構(gòu)
基于分布式的計算也是一樣,可以是偽分布式的,,也可以是完全分布式的,,如下圖所示就是偽分布式的,可以看到在服務(wù)器端多了一個偽分布式的MapReduce服務(wù)器,,用于給系統(tǒng)提供算力:
如下圖所示是采用完全分布式的計算模式,當然模式是MapReduce1.0版本的,,有條件的也可以使用YARN或Spark框架:
2.2.4基于網(wǎng)絡(luò)爬蟲的物理架構(gòu)
基于網(wǎng)絡(luò)爬蟲的系統(tǒng),,其實網(wǎng)絡(luò)爬蟲也只是一個數(shù)據(jù)采集方式,可以規(guī)劃如下,,也就是把網(wǎng)絡(luò)爬蟲單獨出來形成一個數(shù)據(jù)服務(wù)器,。
2.3功能架構(gòu)
功能框架,就是我們對于模塊的功能進行一層一層框架化的搭建,。如果沒有功能框架,,那么就會有以下的風險:
1. 系統(tǒng)功能分布零散,關(guān)聯(lián)性和銜接性差,;
2. 容易遺漏功能,。
常見的功能框架有采用框圖的,如下所示:
最近幾年隨著思維導(dǎo)圖的興起,,越來越多的人也采用思維導(dǎo)圖的模式里設(shè)計功能框圖,,如下所示:
無論是哪一種模式,都是將系統(tǒng)從上到下進行功能的細分,。如何設(shè)計一個優(yōu)秀的功能架構(gòu),,功能架構(gòu)設(shè)計不同于編寫代碼,代碼需要遵循嚴格的語法和編程規(guī)范,。功能框架沒有規(guī)范可遵循,,存在即合理,適合系統(tǒng)開發(fā)和運行的架構(gòu)就是最合理的架構(gòu),。
功能架構(gòu)設(shè)計是在業(yè)務(wù)需求已經(jīng)清晰的前提下進行的,,假定在系統(tǒng)需求分析階段已經(jīng)確定了系統(tǒng)的功能和業(yè)務(wù)范圍,也明確了系統(tǒng)運營需求,。在上述需求還沒有確定的情況下,,不適宜開展系統(tǒng)的架構(gòu)設(shè)計,所以各位同學要想清楚自己為什么要做這個系統(tǒng),?這個系統(tǒng)的意義是什么,?這個系統(tǒng)是為了解決什么樣的問題?只有需求分析階段完善了,,功能架構(gòu)設(shè)計中我們自然知道這個系統(tǒng)有哪些功能,,還有功能之間的層次。
2.4數(shù)據(jù)框架
當然,,這個部分也可以寫在論文的“數(shù)據(jù)設(shè)計”內(nèi)容里,。
2.4.1數(shù)據(jù)庫范式
數(shù)據(jù)庫設(shè)計常見的準則就是要滿足數(shù)據(jù)庫范式,遵從不同的規(guī)范要求,設(shè)計出合理的關(guān)系型數(shù)據(jù)庫,,這些不同的規(guī)范要求被稱為不同的范式,,各種范式呈遞次規(guī)范,越高的范式數(shù)據(jù)庫冗余越小,。 目前關(guān)系數(shù)據(jù)庫有:第一范式(1NF),、第二范式(2NF)、第三范式(3NF),、第四范式(4NF)和第五范式(5NF,,又稱完美范式)。滿足最低要求的范式是第一范式(1NF),。在第一范式的基礎(chǔ)上進一步滿足更多規(guī)范要求的稱為第二范式(2NF),,其余范式以次類推。一般來說,,數(shù)據(jù)庫只需滿足第三范式(3NF)就行了,。
2.4.1.1第一范式(1NF)
第一范式是指在關(guān)系模型中,對于添加的一個規(guī)范要求,,所有的域都應(yīng)該是原子性的,,即數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項,,而不能是集合,,數(shù)組,記錄等非原子數(shù)據(jù)項,。即實體中的某個屬性有多個值時,,必須拆分為不同的屬性。在符合第一范式(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分,。簡而言之,,第一范式就是無重復(fù)的域。
2.4.1.2第二范式(2NF)
第二范式是在第一范式(1NF)的基礎(chǔ)上建立起來的,,即滿足第二范式(2NF)必須先滿足第一范式(1NF),。第二范式(2NF)要求數(shù)據(jù)庫表中的每個實例或記錄必須可以被唯一地區(qū)分。選取一個能區(qū)分每個實體的屬性或?qū)傩越M,,作為實體的唯一標識,。例如在員工表中的身份證號碼即可實現(xiàn)每個一員工的區(qū)分,該身份證號碼即為候選鍵,,任何一個候選鍵都可以被選作主鍵,。在找不到候選鍵時,可額外增加屬性以實現(xiàn)區(qū)分,,如果在員工關(guān)系中,,沒有對其身份證號進行存儲,而姓名可能會在數(shù)據(jù)庫運行的某個時間重復(fù),,無法區(qū)分出實體時,,設(shè)計辟如ID等不重復(fù)的編號以實現(xiàn)區(qū)分,,被添加的編號或ID選作主鍵。(該主鍵的添加是在ER設(shè)計時添加,,不是建庫時隨意添加) 第二范式(2NF)要求實體的屬性完全依賴于主關(guān)鍵字,。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性,如果存在,,那么這個屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成一個新的實體,,新實體與原實體之間是一對多的關(guān)系。為實現(xiàn)區(qū)分通常需要為表加上一個列,,以存儲各個實例的唯一標識,。簡而言之,第二范式就是在第一范式的基礎(chǔ)上屬性完全依賴于主鍵,。
2.4.1.3第三范式(3NF)
第三范式是第二范式(2NF)的一個子集,,即滿足第三范式(3NF)必須滿足第二范式(2NF)。簡而言之,,第三范式(3NF)要求一個關(guān)系中不包含已在其它關(guān)系已包含的非主關(guān)鍵字信息,。例如,存在一個部門信息表,,其中每個部門有部門編號(dept_id),、部門名稱、部門簡介等信息,。那么在員工信息表中列出部門編號后就不能再將部門名稱,、部門簡介等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表,,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,,否則就會有大量的數(shù)據(jù)冗余。簡而言之,,第三范式就是屬性不依賴于其它非主屬性,,也就是在滿足2NF的基礎(chǔ)上,任何非主屬性不得傳遞依賴于主屬性,。
2.4.2科德十二定律
關(guān)系數(shù)據(jù)庫之父 埃德加·弗蘭克·科德 的 12 條法則,,也稱“科德十二定律”,作為數(shù)據(jù)庫設(shè)計的指導(dǎo)性方針:
一個關(guān)系形的關(guān)系數(shù)據(jù)庫系統(tǒng)必須能完全通過它的關(guān)系能力來管理數(shù)據(jù)庫,。
1,、信息法則
關(guān)系數(shù)據(jù)庫中的所有信息都用唯一的一種方式表示:表中的值。
2,、保證訪問法則
依靠表名,、主鍵值和列名的組合,保證能訪問每個數(shù)據(jù)項。
3,、空值的系統(tǒng)化處理
支持空值(NULL),,以系統(tǒng)化的方式處理空值,空值不依賴于數(shù)據(jù)類型,。
4,、基于關(guān)系模型的動態(tài)聯(lián)機目錄
數(shù)據(jù)庫的描述應(yīng)該是自描述的,在邏輯級別上和普通數(shù)據(jù)采用同樣的表示方式,,即數(shù)據(jù)庫必須含有描述該數(shù)據(jù)庫結(jié)構(gòu)的系統(tǒng)表或者數(shù)據(jù)庫描述信息應(yīng)該包含在用戶可以訪問的表中,。
5、統(tǒng)一的數(shù)據(jù)子語言法則
一個關(guān)系數(shù)據(jù)庫系統(tǒng)可以支持幾種語言和多種終端使用方式,,但必須至少有一種語言,,它的語句能夠一某種定義良好的語法表示為字符串,并能全面地支持以下所有規(guī)則:數(shù)據(jù)定義,、視圖定義,、數(shù)據(jù)操作、約束,、授權(quán)以及事務(wù),。(這種語言就是 SQL)。
6,、視圖更新法則
所有理論上可以更新的視圖也可以由系統(tǒng)更新,。
7、高級的插入,、更新和刪除操作
把一個基礎(chǔ)關(guān)系或派生關(guān)系作為單個操作對象處理的能力不僅適應(yīng)于數(shù)據(jù)的檢索,,還適用于數(shù)據(jù)的插入,、修改個刪除,,即在插入、修改和刪除操作中數(shù)據(jù)行被視作集合,。
8,、數(shù)據(jù)的物理獨立性
不管數(shù)據(jù)庫的數(shù)據(jù)在存儲表示或訪問方式上怎么變化,應(yīng)用程序和終端活動都保持著邏輯上的不變性,。
9,、數(shù)據(jù)的邏輯獨立性
當對表做了理論上不會損害信息的改變時,應(yīng)用程序和終端活動都會保持邏輯上的不變性,。
10,、數(shù)據(jù)完整性的獨立性
專用于某個關(guān)系型數(shù)據(jù)庫的完整性約束必須可以用關(guān)系數(shù)據(jù)庫子語言定義,而且可以存儲在數(shù)據(jù)目錄中,,而非程序中,。
11、分布獨立性
不管數(shù)據(jù)在物理是否分布式存儲,或者任何時候改變分布策略,,RDBMS 的數(shù)據(jù)操縱子語言必須能使應(yīng)用程序和終端活動保持邏輯上的不變性,。
12、非破壞性法則
如果一個關(guān)系數(shù)據(jù)庫系統(tǒng)支持某種低級(一次處理單個記錄)語言,,那么這個低級語言不能違反或繞過更高級語言(一次處理多個記錄)規(guī)定的完整性法則或約束,,即用戶不能以任何方式違反數(shù)據(jù)庫的約束。
2.4.3還需要思考
我們設(shè)計數(shù)據(jù)庫的時候,,還可以思考一下幾點:
1,、如何降低對數(shù)據(jù)庫功能的依賴
以往系統(tǒng)設(shè)計的時候,我們經(jīng)常在數(shù)據(jù)庫端設(shè)置很多的函數(shù),、存儲過程,、觸發(fā)器等等。但是近年來隨著計算機算力的提升,,內(nèi)存變得越來越廉價等因素,,越來越多的功能慢慢有由程序端實現(xiàn),而非數(shù)據(jù)庫端來實現(xiàn),。原因在于,,如果功能由數(shù)據(jù)庫來實現(xiàn)時,一旦更換的一個數(shù)據(jù)庫管理系統(tǒng),,比如從sqlserver換成mysql,,如果新的系統(tǒng)不如之前的系統(tǒng)強大,不能實現(xiàn)某些功能,,這時我們將不得不去修改代碼,。所以,為了杜絕此類情況的發(fā)生,,功能應(yīng)該由程序來實現(xiàn),,數(shù)據(jù)庫僅僅負責數(shù)據(jù)的存儲,以達到最低的耦合,。什么是系統(tǒng)的耦合,?軟件工程中的耦合是指各個模塊依賴程度,為了便于維護,,自然希望耦合越低越好,,你想想,如果你要改一個模塊,,結(jié)果連帶你其它模塊也要改,,那你豈不頭大。特別有些系統(tǒng)是以集群方式合作的,,耦合度高的系統(tǒng)很容易牽一發(fā)而動全身,。
2,、定義實體關(guān)系的原則
當定義一個實體與其他實體之間的關(guān)系時,需要考量如下:
(1)牽涉到的實體識別出關(guān)系所涉及的所有實體,。
(2)所有權(quán)考慮一個實體“擁有”另一個實體的情況,。
(3)基數(shù)考量一個實體的實例和另一個實體實例關(guān)聯(lián)的數(shù)量。
3,、關(guān)系與表數(shù)量
描述 1:1 關(guān)系最少需要 1 張表,。
描述 1:n 關(guān)系最少需要 2 張表。
描述 n:n 關(guān)系最少需要 3 張表,。
4,、列意味著唯一的值
如果表示坐標(0,0),應(yīng)該使用兩列表示,,而不是將“0,0”放在 1 個列中,。
5、列的順序
列的順序?qū)τ诒韥碚f無關(guān)緊要,,但是從習慣上來說,,采用“主鍵 + 外鍵 + 實體數(shù)據(jù) + 非實體數(shù)據(jù)”這樣的順序?qū)α羞M行排序顯然能得到比較好的可讀性。
6,、定義主鍵和外鍵
數(shù)據(jù)表必須定義主鍵和外鍵(如果有外鍵),。定義主鍵和外鍵不僅是關(guān)系數(shù)據(jù)庫管理系統(tǒng)的要求,同時也是開發(fā)的要求,。幾乎所有的代碼生成器都需要這些信息來生成常用方法的代碼(包括 SQL 文和引用),,所以,定義主鍵和外鍵在開發(fā)階段是必須的,。之所以說在開發(fā)階段是必須的是因為,,有不少團隊出于性能考慮會在進行大量測試后,在保證參照完整性不會出現(xiàn)大的缺陷后,,會刪除掉數(shù)據(jù)庫的的所有外鍵,,以達到最優(yōu)性能。當然,,很多人建議在性能沒有出現(xiàn)問題時應(yīng)該保留外鍵,,而即便性能真的出現(xiàn)問題,也應(yīng)該對 SQL 文進行優(yōu)化,,而非放棄外鍵約束。
|