成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

系統(tǒng)架構(gòu)設(shè)計(jì)之?dāng)?shù)據(jù)模型的選型難題

開發(fā) 前端
數(shù)據(jù)模型有很多類型,每種都有其最佳實(shí)踐。考慮到數(shù)據(jù)模型對(duì)其上的軟件應(yīng)用有巨大影響( 哪些可以做、不能做),因此需慎重選擇適合業(yè)務(wù)的數(shù)據(jù)模型。

數(shù)據(jù)模型不僅對(duì)軟件編寫方式,還對(duì)如何思考待解決的問題都有影響。

大多數(shù)應(yīng)用程序都是通過疊加一層層的數(shù)據(jù)模型構(gòu)建而來 。因此每層都面臨問題:如何將其用下一層表示?如:

1. 作為一名開發(fā),觀測(cè)現(xiàn)實(shí)世界(包括人員、組織 、貨物 、行為、資金流動(dòng)、傳感器等) ,通過對(duì)象或數(shù)據(jù)結(jié)構(gòu)及操作這些數(shù)據(jù)結(jié)構(gòu)的API來對(duì)其建模,這些數(shù)據(jù)結(jié)構(gòu)往往特定于該應(yīng)用

2. 當(dāng)需要存儲(chǔ)這些數(shù)據(jù)結(jié)構(gòu)時(shí),可采用通用數(shù)據(jù)模型(例如JSON XML文檔、關(guān)系數(shù)據(jù)庫(kù)中的表或圖模型)來表示

3. DBA接著決定用何種內(nèi)存、磁盤或網(wǎng)絡(luò)的 節(jié)格式來表示上述JSON/XML/關(guān)系/圖形數(shù)據(jù)。數(shù)據(jù)表示需要支持多種方式的查詢?cè)儭⑺阉鳌⒉僮骱吞幚頂?shù)據(jù)(系列三時(shí)介紹)

4. 在更下一層,硬件工程師則需要考慮用電流、光脈沖、磁場(chǎng)等來表示字節(jié)

復(fù)雜的應(yīng)用程序可能會(huì)有更多的中間層:如基于API來構(gòu)建上層API ,但基本思想一樣:每層都通過提供一個(gè)簡(jiǎn)潔的數(shù)據(jù)模型來隱藏下層的復(fù)雜性。這些抽象機(jī)制使得不同團(tuán)隊(duì)可高效協(xié)作,例如數(shù)據(jù)廠商的工程師和使用數(shù)據(jù)庫(kù)的開發(fā)很好的協(xié)作。

數(shù)據(jù)模型有很多類型,每種都有其最佳實(shí)踐。考慮到數(shù)據(jù)模型對(duì)其上的軟件應(yīng)用有巨大影響( 哪些可以做、不能做),因此需慎重選擇適合業(yè)務(wù)的數(shù)據(jù)模型。

本本會(huì)介紹一些用于數(shù)據(jù)存儲(chǔ)和查詢的通用數(shù)據(jù)模型 (上面提到的第2點(diǎn))。尤其,將比較關(guān)系模型 、文檔模型和一些基于圖的數(shù)據(jù)模型。還討論多種查詢語言并比較使用場(chǎng)景。

1.關(guān)系模型與文檔模型

如今SQL是最著名的數(shù)據(jù)模型 ,它基于Edgar Codd 1970年提出的關(guān)系模型:數(shù)據(jù)被組織成關(guān)系(relations),在SQL中稱為表(table),其中每個(gè)關(guān)系都是元組(tuples)的無序集合(SQL中稱為行)。

關(guān)系模型曾經(jīng)只是理論建議, 很多人懷凝它是否能被高效實(shí)現(xiàn)。但20世紀(jì)80年代中期,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)( RDBMS )和SQL已成為大多數(shù)需要存儲(chǔ)、查詢具有某種規(guī)則結(jié)構(gòu)的數(shù)據(jù)的首選工具。關(guān)系數(shù)據(jù)庫(kù)的主導(dǎo)地位持續(xù)至今已有三十多年,算得上是計(jì)算機(jī)史的不朽傳奇。

關(guān)系數(shù)據(jù)庫(kù)核心在于商業(yè)數(shù)據(jù)處理, 20世紀(jì)60年代和70年代主要運(yùn)行在大型計(jì)算機(jī)。如今來看,用例很常見,主要是:

  • 事務(wù)處理(包括輸入銷售和銀行交易、訂票 、倉(cāng)庫(kù)庫(kù)存 )
  • 批處理(例如客戶發(fā)票、工資單 、報(bào)告

當(dāng)時(shí)的其他數(shù)據(jù)庫(kù)迫使開發(fā)人員考慮數(shù)據(jù)的內(nèi)部表示。關(guān)系模型的目標(biāo)就是將實(shí)現(xiàn)細(xì)節(jié)隱藏在更簡(jiǎn)潔的接口下。20世紀(jì)70年代和80代初期,網(wǎng)絡(luò)模型和層次模型是兩個(gè)主要選擇,但最終關(guān)系模型主宰該領(lǐng)域。

對(duì)象數(shù)據(jù)庫(kù)曾在20世紀(jì)80年代后期和90年代初期起起伏伏。XML數(shù)據(jù)庫(kù)則出現(xiàn)在21世紀(jì)初,但也僅限于利基市場(chǎng)。關(guān)系模型的競(jìng)爭(zhēng)者都曇花一現(xiàn)。

如今關(guān)系數(shù)據(jù)庫(kù)超出它們最初的商業(yè)數(shù)據(jù)處理范圍,推廣到各種案例:在線發(fā)布、論壇、社

交網(wǎng)絡(luò)、電子商務(wù) 游戲、 SaaS。

2.NoSQL

21世紀(jì),NoSQL成為推翻關(guān)系模式主導(dǎo)地位的有力競(jìng)爭(zhēng)者。NoSQL名字不恰當(dāng),因?yàn)樗鋵?shí)并不代表具體技術(shù),最初只是作為吸引人眼球的Twitter標(biāo)簽頻頻出現(xiàn)在2009年的開源、分布式及非關(guān)系數(shù)據(jù)庫(kù)的見面會(huì)。現(xiàn)在很多新興數(shù)據(jù)庫(kù)系統(tǒng)總是會(huì)打上NoSQL標(biāo)簽,而其含義也已經(jīng)被逆向重新解釋為“不僅僅是SQL”。

采用NoSQL數(shù)據(jù)庫(kù)的驅(qū)動(dòng)因素:

  • 比關(guān)系數(shù)據(jù)庫(kù)更好的擴(kuò)展性需求包括支持超大數(shù)據(jù)集或超高寫入吞吐量
  • 普遍偏愛免費(fèi)和開源軟件而非商業(yè)數(shù)據(jù)庫(kù)產(chǎn)品
  • 關(guān)系模型不能很好支持一些特定查詢
  • 對(duì)關(guān)系模式某些限制性感到沮喪,渴望更具動(dòng)態(tài)和表達(dá)力的數(shù)據(jù)模型

不同應(yīng)用程序有不同需求,沒有銀彈技術(shù),可預(yù)見的將來,關(guān)系數(shù)據(jù)庫(kù)仍將繼續(xù)與各種非關(guān)系數(shù)據(jù)存儲(chǔ)一起使用,這種思路有時(shí)也被稱為混合持久化。

3.對(duì)象-關(guān)系不匹配

現(xiàn)在大多數(shù)應(yīng)用開發(fā)都采用OOP編程語言 ,由于兼容性問題,普遍對(duì)SQL數(shù)據(jù)模型抱怨:若數(shù)據(jù)存儲(chǔ)在關(guān)系表,則應(yīng)用層代碼中的對(duì)象與表、行和列的數(shù)據(jù)庫(kù)模型之間需要一個(gè)笨拙的轉(zhuǎn)換層。模型之間的脫離有時(shí)被稱為阻抗失諧(電子學(xué)術(shù)語:每個(gè)電路的輸入和輸出都有 一定的阻抗(交流電阻) 一個(gè)電路的輸出連接到另一個(gè)電路的輸入時(shí),若兩個(gè)電路的輸出和輸入阻抗匹配,則連接上的功率傳輸將被最大化,阻抗不匹配會(huì)導(dǎo)致信號(hào)反射和其他故障)。

像Hibernate對(duì)象關(guān)系映射(ORM) 框架減少了此轉(zhuǎn)換層的樣板代碼,但也無法完全隱藏兩個(gè)模型之間差異。

簡(jiǎn)歷案例

如下展示了關(guān)系模式表示LinkedIn簡(jiǎn)歷:

圖片

圖一

整個(gè)簡(jiǎn)歷可通過唯一標(biāo)識(shí)符user id標(biāo)識(shí)。像first_name、last_name字段在每個(gè)用戶中只出現(xiàn)一次,所以建模為users表中的列。而大多數(shù)人在他們的職業(yè)中有一個(gè)以上工作,且可能有多個(gè)教育階段和任意數(shù)量的聯(lián)系信息。用戶與這些項(xiàng)目之間是一對(duì)多,可用多種方式表示:

  • 在傳統(tǒng)SQL模型( SQL1999之前), 最常見的規(guī)范化表示是將職位、教育和聯(lián)系信息放在單獨(dú)表,并使用外鍵引用users表。
  • 之后的SQL標(biāo)準(zhǔn)增加了對(duì)結(jié)構(gòu)化數(shù)據(jù)類型和XML數(shù)據(jù)的支持。這允許將多值數(shù)據(jù)存儲(chǔ)在單行內(nèi),井支持在這些文檔中查詢和索引。Oracle、DB2、SQLServr、PostgreSQL都不同程度支持這些功能。一些數(shù)據(jù)庫(kù)也支持JSON,如DB2、MySQL和PostgreSQL。
  • 將工作、教育和聯(lián)系信息編碼為JSON或XML,存儲(chǔ)在數(shù)據(jù)庫(kù)的文本列,并由應(yīng)用程序解釋其結(jié)構(gòu)和內(nèi)容。對(duì)于此方法,通常不能使用數(shù)據(jù)庫(kù)查詢?cè)摼幋a列中的值。

簡(jiǎn)歷這樣的數(shù)據(jù)結(jié)構(gòu),主要是個(gè)自包含的文檔( document ),因此用JSON表示非常合適:

圖片

面向文檔的數(shù)據(jù)庫(kù)(如MongoDB)都支持該數(shù)據(jù)模型。

有人覺得JSON模型減少了應(yīng)用程序代碼和存儲(chǔ)層之間的阻抗失配。然而,JSON作為數(shù)據(jù)編碼格式也存在問題。缺乏模式常常被認(rèn)為是一個(gè)優(yōu)勢(shì)~

JSON表示比關(guān)系模式表示的多表模式具有更好的局部性。若要在關(guān)系模式中讀取一份簡(jiǎn)歷,則:

? 要么執(zhí)行多個(gè)查詢(通過user_id查詢每個(gè)表)

? 要么在users表及其從屬表之間執(zhí)行混亂的多路聯(lián)結(jié)

而JSON表示方法,所有的相關(guān)信息都在一個(gè)地方,一次查詢即可。

用戶簡(jiǎn)歷到用戶的職位、教育歷史和聯(lián)系信息的 對(duì)多關(guān)系,意味著數(shù)據(jù)存在樹狀結(jié)構(gòu),JSON表示將該樹結(jié)構(gòu)顯式化,一對(duì)多的關(guān)系形成樹狀結(jié)構(gòu):

圖片

4.多對(duì)一、多對(duì)多

上面案例的region_id、indu0stry_id 定義為ID ,而非純文本字符串,如"Greater Seattle Area Philanthropy",why?

若用戶界面是可以輸入地區(qū)或行業(yè)的自由文本字段,則將其存儲(chǔ)為純文本字符串更有意義。但擁有地理區(qū)域和行業(yè)的標(biāo)準(zhǔn)化列表,并讓用戶從下拉列表或自動(dòng)填充器中進(jìn)行選擇更有優(yōu)勢(shì):

  • 所有簡(jiǎn)歷保持樣式和輸入值一致。
  • 避免歧義(例如,若存在一些同名城市)
  • 易于更新:名字只保存一次,因此,若需要改變(例如,由于政治而更改城市名稱),易全面更新。
  • 本地化支持:當(dāng)網(wǎng)站被翻譯成其他語,標(biāo)準(zhǔn)化的列表方便本地化,因此地區(qū)和行業(yè)可以用查看者的母語顯示。
  • 更好的搜索支持:例如,搜索華盛頓州的慈善家可匹配到過個(gè)簡(jiǎn)歷,因?yàn)榈貐^(qū)列表可以將西雅圖屬于華盛頓的信息編碼進(jìn)來(而從“大西雅圖地區(qū)”字符串中并不能看出西雅圖屬于華盛頓)。

無論是存儲(chǔ)ID or 文本字符串,都涉及內(nèi)容重復(fù)問題:

  • 使用ID ,對(duì)人類有意義的信息(例如慈善這個(gè)詞)只存儲(chǔ)在一個(gè)地方,引用它的所有內(nèi)容都使用ID(ID只在數(shù)據(jù)庫(kù)中有意義。
  • 直接存儲(chǔ)文本時(shí), 則使用它的每條記錄中都保存了一份這樣的可讀信息。

使用ID的好處:對(duì)人類沒有任何直接意義,所以永遠(yuǎn)不需要直接改變。即使ID標(biāo)識(shí)的信息變化,他也能繼續(xù)保持不變。任何對(duì)人類有意義的東西都可能變更。若這些信息被復(fù)制 ,則所有副本都得更新。這會(huì)導(dǎo)致更多寫開銷,且存在數(shù)據(jù)不一致風(fēng)險(xiǎn)。消除這種重復(fù),也正是數(shù)據(jù)庫(kù)規(guī)范化的核心思想。

而這種數(shù)據(jù)規(guī)范化需要表達(dá)多對(duì)一關(guān)系(許多人生活在同一地區(qū), 在同一行業(yè)工作),這并不是很適合文檔模型:

  • 關(guān)系數(shù)據(jù)庫(kù)由于支持聯(lián)結(jié)操作,可方便通過ID引用其他表中的行
  • 文檔數(shù)據(jù)庫(kù)中, 一對(duì)多的樹狀結(jié)構(gòu)不需要聯(lián)結(jié),支持聯(lián)結(jié)通常也很弱

若數(shù)據(jù)庫(kù)本身不支持聯(lián)結(jié),則必須在應(yīng)用程序代碼中,通過對(duì)數(shù)據(jù)庫(kù)進(jìn)行多次查詢來模擬聯(lián)結(jié)(對(duì)于上述例子,地區(qū)和行業(yè)的列表很小且短期內(nèi)不大可能變化, 應(yīng)用程序可將其緩存在內(nèi)存。但無論如何,聯(lián)結(jié)工作其實(shí)從數(shù)據(jù)庫(kù)轉(zhuǎn)移到了應(yīng)用層。

即使應(yīng)用程序的初始版本非常適合采用無聯(lián)結(jié) 文檔模型 但隨著應(yīng)用支持越來越多功能,數(shù)據(jù)也變更互聯(lián)一體化。例如,考慮可能對(duì)簡(jiǎn)歷進(jìn)行的變更:

  • 組織和學(xué)校作為實(shí)體 前面定義中, organization(用戶所在公司)、school_name (用戶所在學(xué)校 )都是字符串。也許他們應(yīng)該定義為實(shí)體的引用?然后每個(gè)組織、學(xué)校或大學(xué)都擁有自己的網(wǎng)頁 (logo 、新聞發(fā)布源等) 。每個(gè)簡(jiǎn)歷都能鏈接到相關(guān)組織和學(xué)校,包括他們的logo和其他信息
  • 推薦假設(shè)添加這樣一個(gè)新功能:一個(gè)用戶能推薦其他用戶。推薦顯示在被推薦者的簡(jiǎn)歷上,并附上推薦人的姓名和照片。若推薦人更新了他們的照片, 他們所寫的任何推薦都需顯示新照片。因此,推薦需要有一個(gè)到作者簡(jiǎn)歷的引用。

圖片

如下圖展示了這些新功能如何定義多對(duì)多。每個(gè)虛線矩形框數(shù)據(jù)可組織為一個(gè)文檔,但指向組織、學(xué)校及其他用戶的關(guān)系則需表示為引用,并且在查詢時(shí),需要聯(lián)結(jié)操作。多對(duì)多關(guān)系來擴(kuò)展簡(jiǎn)歷:

? 圖片 ?

責(zé)任編輯:武曉燕 來源: JavaEdge
相關(guān)推薦

2023-08-16 12:34:16

同步備份異步備份

2023-07-06 00:41:03

SQLNoSQL數(shù)據(jù)庫(kù)

2023-07-09 15:20:00

緩存平衡性能

2023-07-05 00:36:38

系統(tǒng)架構(gòu)設(shè)計(jì)

2021-07-14 10:09:05

架構(gòu)模型數(shù)據(jù)

2023-04-13 08:23:28

軟件架構(gòu)設(shè)計(jì)

2014-05-19 10:08:36

IM系統(tǒng)架構(gòu)設(shè)計(jì)

2022-06-20 09:17:02

數(shù)據(jù)查詢請(qǐng)求數(shù)據(jù)庫(kù)

2021-01-18 05:20:52

數(shù)倉(cāng)hive架構(gòu)

2023-07-05 08:00:52

MetrAuto系統(tǒng)架構(gòu)

2022-11-22 08:42:38

數(shù)據(jù)庫(kù)

2012-03-05 10:54:03

NoSQL

2015-06-02 04:17:44

架構(gòu)設(shè)計(jì)審架構(gòu)設(shè)計(jì)說明書

2023-07-02 06:47:42

LOFTER系統(tǒng)架構(gòu)

2021-02-28 22:20:25

2010-05-26 14:37:56

Cassandra數(shù)據(jù)

2015-06-02 04:34:05

架構(gòu)設(shè)計(jì)

2012-05-30 09:43:45

業(yè)務(wù)邏輯層

2009-06-22 14:48:21

DRY架構(gòu)設(shè)計(jì)

2017-06-27 10:08:29

數(shù)據(jù)倉(cāng)庫(kù)模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美日韩免费一区二区三区 | 亚洲欧美网站 | 亚洲成人一区二区三区 | 极品国产视频 | 成人午夜精品 | 毛片区| 国产精品自产拍 | 男女羞羞视频在线免费观看 | 国产欧美性成人精品午夜 | 国内精品一区二区 | 91精品国产综合久久婷婷香蕉 | 放个毛片看看 | 国产精品久久久久久久久久久免费看 | 99久久婷婷国产精品综合 | 激情综合五月天 | 国产一区二区三区四区五区加勒比 | 亚洲网站在线 | av综合站 | 99精品视频在线观看免费播放 | 成人激情视频免费观看 | 久久国产香蕉 | 久久精彩视频 | 91亚洲精品国偷拍自产在线观看 | 国产精品久久片 | 久久精品一区二区三区四区 | 一区二区三区免费 | 成人黄页在线观看 | 美女久久久久久久久 | 亚州综合在线 | 超碰在线人人干 | 亚洲国产精品一区二区久久 | 日韩在线中文 | 亚洲精品性视频 | 中文字幕国产视频 | 香蕉一区 | 国产亚洲欧美在线视频 | 天天操夜夜骑 | 亚洲成人av | 精品欧美一区二区三区久久久 | 久久国产精品99久久久久久丝袜 | 欧美精品三区 |