中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站建設(shè)前臺(tái)和后臺(tái)設(shè)計(jì)如何讓百度快速收錄新網(wǎng)站

網(wǎng)站建設(shè)前臺(tái)和后臺(tái)設(shè)計(jì),如何讓百度快速收錄新網(wǎng)站,做圖表的網(wǎng)站推薦,WordPress數(shù)據(jù)庫(kù)切割文章目錄一、NoSQL 是什么1.1 NoSQL 簡(jiǎn)史1.2 NoSQL 的種類及其特性1.3 NoSQL 特點(diǎn)1.4 NoSQL 的優(yōu)缺點(diǎn)1.5 NoSQL 與 SQL 數(shù)據(jù)庫(kù)的比較二、MongoDB 基礎(chǔ)知識(shí)2.1 MongoDB 是什么2.2 MongoDB 的體系結(jié)構(gòu)2.3 MongoDB 的特點(diǎn)2.4 MongoDB 鍵特性2.5 MongoDB 的核心服務(wù)和工具2.6 Mongo…

文章目錄

  • 一、NoSQL 是什么
    • 1.1 NoSQL 簡(jiǎn)史
    • 1.2 NoSQL 的種類及其特性
    • 1.3 NoSQL 特點(diǎn)
    • 1.4 NoSQL 的優(yōu)缺點(diǎn)
    • 1.5 NoSQL 與 SQL 數(shù)據(jù)庫(kù)的比較
  • 二、MongoDB 基礎(chǔ)知識(shí)
    • 2.1 MongoDB 是什么
    • 2.2 MongoDB 的體系結(jié)構(gòu)
    • 2.3 MongoDB 的特點(diǎn)
    • 2.4 MongoDB 鍵特性
    • 2.5 MongoDB 的核心服務(wù)和工具
    • 2.6 MongoDB 應(yīng)用場(chǎng)景
    • 2.7 MongoDB 數(shù)據(jù)模型
      • 2.7.1 數(shù)據(jù)模型
      • 2.7.2 多態(tài)模式
  • 三、MongoDB 的安裝配置及可視化工具
  • 四、MongoDB 數(shù)據(jù)庫(kù)管理
    • 4.1 MongoDB shell
    • 4.2 MongoDB shell 命令
    • 4.3 MongoDB shell 原生方法
    • 4.4 MongoDB 的基本操作
      • 4.4.1 MongoDB 數(shù)據(jù)庫(kù)的連接
      • 4.4.2 數(shù)據(jù)庫(kù)
      • 4.4.3 集合
      • 4.4.4 文檔
      • 4.4.5 數(shù)據(jù)類型
      • 4.4.6 索引

本文主要介紹 NoSQL 數(shù)據(jù)庫(kù)的發(fā)展以及它其中最熱門(mén)的 MongoDB 數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)。通過(guò)本文內(nèi)容的學(xué)習(xí),讀者可以學(xué)習(xí)到 MongoDB 數(shù)據(jù)庫(kù)安裝方式以及 MongoDB 的基礎(chǔ)使用等。

一、NoSQL 是什么

NoSQL,泛指非關(guān)系型數(shù)據(jù)庫(kù)。 隨著互聯(lián)網(wǎng) Web 2.0 網(wǎng)站的興起,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在應(yīng)付 Web 2.0 網(wǎng)站,特別是超大規(guī)模和高并發(fā)的 SNS 類型的 Web 2.0 純動(dòng)態(tài)網(wǎng)站時(shí)已經(jīng)顯得力不從心,暴露了很多難以克服的問(wèn)題,而非關(guān)系型數(shù)據(jù)庫(kù)則由于其自身的特點(diǎn)得到了非常迅速的發(fā)展。NoSQL 數(shù)據(jù)庫(kù)的產(chǎn)生就是為了應(yīng)對(duì)大規(guī)模數(shù)據(jù)集合以及多重?cái)?shù)據(jù)種類帶來(lái)的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題。

1.1 NoSQL 簡(jiǎn)史

NoSQL 一詞最早出現(xiàn)于 1998 年,是 Carlo Strozzi 開(kāi)發(fā)的一個(gè)輕量、開(kāi)源、不提供 SQL 功能的關(guān)系型數(shù)據(jù)庫(kù)。2009年,Last.fmJohan Oskarsson 發(fā)起了一次關(guān)于分布式開(kāi)源數(shù)據(jù)庫(kù)的討論,來(lái)自 RackspaceEric Evans 再次提出了 NoSQL 的概念,這時(shí)的 NoSQL 主要指非關(guān)系型、分布式、不提供 ACID 的數(shù)據(jù)庫(kù)設(shè)計(jì)模式。

2009年在亞特蘭大舉行的 no:sql(east) 討論會(huì)是一個(gè)里程碑,其口號(hào)是 select fun, profit from real_world where relational=false;。 因此,對(duì) NoSQL 最普遍的解釋是 非關(guān)聯(lián)型的,強(qiáng)調(diào) Key-Value Stores 和文檔數(shù)據(jù)庫(kù)的優(yōu)點(diǎn),而不是單純地反對(duì) RDBMS。

1.2 NoSQL 的種類及其特性

NoSQL 數(shù)據(jù)庫(kù)有多種類型,每種類型都有各自的特點(diǎn),如下表所示:
請(qǐng)?zhí)砑訄D片描述
下面介紹兩種不同類型的數(shù)據(jù)庫(kù)。面向列的數(shù)據(jù)庫(kù):

Cassandra、HBase、HyperTable 屬于這種類型。普通的關(guān)系型數(shù)據(jù)庫(kù)都是以行為單位來(lái)存儲(chǔ)數(shù)據(jù)的,擅長(zhǎng)以行為單位讀入數(shù)據(jù),比如特定條件數(shù)據(jù)的獲取。因此,關(guān)系型數(shù)據(jù)庫(kù)也被稱為面向行的數(shù)據(jù)庫(kù)。相反,面向列的數(shù)據(jù)庫(kù)是以列為單位來(lái)存儲(chǔ)數(shù)據(jù)的,擅長(zhǎng)以列為單位讀入數(shù)據(jù)。面向列的數(shù)據(jù)庫(kù)具有高擴(kuò)展性,即使數(shù)據(jù)增加也不會(huì)降低相應(yīng)的處理速度 (特別是寫(xiě)入速度),所以它主要應(yīng)用于需要處理大量數(shù)據(jù)的情況。另外,把它作為批處理程序的存儲(chǔ)器來(lái)對(duì)大量數(shù)據(jù)進(jìn)行更新也是非常有用的。但由于面向列的數(shù)據(jù)庫(kù)跟現(xiàn)行數(shù)據(jù)庫(kù)存儲(chǔ)的思維方式有很大不同,故應(yīng)用起來(lái)十分困難。

面向文檔的數(shù)據(jù)庫(kù):

MongoDB、CouchDB 屬于這種類型,它們屬于 NoSQL 數(shù)據(jù)庫(kù),但與鍵值存儲(chǔ)相異。1、不定義表結(jié)構(gòu)。 即使是不定義表結(jié)構(gòu),也可以像定義表結(jié)構(gòu)一樣使用,還省去了變更表結(jié)構(gòu)的麻煩。2、可以使用復(fù)雜的查詢條件。 與鍵值存儲(chǔ)不同的是,面向文檔的數(shù)據(jù)庫(kù)可以通過(guò)復(fù)雜的查詢條件來(lái)獲取數(shù)據(jù),雖然不具備事務(wù)處理和 Join 這些關(guān)系型數(shù)據(jù)庫(kù)所具有的處理能力,但除此以外的其他處理基本上都能實(shí)現(xiàn)。3、鍵值存儲(chǔ)的數(shù)據(jù)庫(kù)。 它的數(shù)據(jù)是以鍵值的形式存儲(chǔ)的,雖然它的速度非???#xff0c;但基本上只能通過(guò)鍵的完全一致查詢獲取數(shù)據(jù),根據(jù)數(shù)據(jù)的保存方式可以分為臨時(shí)性、永久性和兩者兼具三種。

補(bǔ)充:

1、臨時(shí)性。 所謂臨時(shí)性就是數(shù)據(jù)有可能丟失,memcached 把所有數(shù)據(jù)都保存在內(nèi)存中,這樣保存和讀取的速度非???#xff0c;但是當(dāng) memcached 停止時(shí),數(shù)據(jù)就不存在了。由于數(shù)據(jù)保存在內(nèi)存中,所以無(wú)法操作超出內(nèi)存容量的數(shù)據(jù),舊數(shù)據(jù)會(huì)丟失??傮w來(lái)說(shuō),在內(nèi)存中保存數(shù)據(jù)、可以進(jìn)行非??焖俚谋4婧妥x取處理、數(shù)據(jù)有可能丟失。

2、永久性。 所謂永久性就是數(shù)據(jù)不會(huì)丟失,這里的鍵值存儲(chǔ)是把數(shù)據(jù)保存在硬盤(pán)上,與臨時(shí)性比起來(lái),由于必然要發(fā)生對(duì)硬盤(pán)的 IO 操作,所以性能上還是有差距的,但數(shù)據(jù)不會(huì)丟失是它最大的優(yōu)勢(shì)。總體來(lái)說(shuō),在硬盤(pán)上保存數(shù)據(jù)、可以進(jìn)行非常快速的保存和讀取處理(但無(wú)法與 memcached 相比)、數(shù)據(jù)不會(huì)丟失。

3、兩者兼具。 Redis 屬于這種類型。Redis 有些特殊,臨時(shí)性和永久性兼具。Redis 首先把數(shù)據(jù)保存在內(nèi)存中,在滿足特定條件(默認(rèn)是15分鐘一次以上,5分鐘內(nèi)10個(gè)以上,1分鐘內(nèi)10000個(gè)以上的鍵發(fā)生變更)的時(shí)候?qū)?shù)據(jù)寫(xiě)入到硬盤(pán)中,這樣既確保了內(nèi)存中數(shù)據(jù)的處理速度,又可以通過(guò)寫(xiě)入硬盤(pán)來(lái)保證數(shù)據(jù)的永久性,這種類型的數(shù)據(jù)庫(kù)特別適合處理數(shù)組類型的數(shù)據(jù)??傮w來(lái)說(shuō),同時(shí)在內(nèi)存和硬盤(pán)上保存數(shù)據(jù)、可以進(jìn)行非??焖俚谋4婧妥x取處理、保存在硬盤(pán)上的數(shù)據(jù)不會(huì)消失(可以恢復(fù))、適合于處理數(shù)組類型的數(shù)據(jù)。

1.3 NoSQL 特點(diǎn)

關(guān)系型數(shù)據(jù)庫(kù)經(jīng)過(guò)幾十年的發(fā)展,各種優(yōu)化工作已經(jīng)做得很深了,而 NoSQL 系統(tǒng)也從中吸收了關(guān)系型數(shù)據(jù)庫(kù)的技術(shù),我們從系統(tǒng)設(shè)計(jì)的角度來(lái)了解一下 NoSQL 數(shù)據(jù)庫(kù)的四大特點(diǎn)。

1、索引支持。 關(guān)系型數(shù)據(jù)庫(kù)創(chuàng)立之初沒(méi)有想到今天的互聯(lián)網(wǎng)應(yīng)用對(duì)可擴(kuò)展性提出如此高的要求,因此,設(shè)計(jì)時(shí)主要考慮的是簡(jiǎn)化用戶的工作,SQL 語(yǔ)言的產(chǎn)生促成數(shù)據(jù)庫(kù)接口的標(biāo)準(zhǔn)化,從而形成了 Oracle 這樣的數(shù)據(jù)庫(kù)公司并帶動(dòng)了上下游產(chǎn)業(yè)鏈的發(fā)展。關(guān)系型數(shù)據(jù)庫(kù)的單機(jī)存儲(chǔ)引擎支持索引,比如 MySQLInnoDB 存儲(chǔ)引擎需要支持索引,而 NoSQL 系統(tǒng)的單機(jī)存儲(chǔ)引擎是純粹的,只需要支持基于主鍵的隨機(jī)讀取和范圍查詢。NoSQL 系統(tǒng)在系統(tǒng)層面提供對(duì)索引的支持,比如有一個(gè)用戶表,主鍵為 user_id,每個(gè)用戶有很多屬性,包括用戶名,照片 ID(photo_id),照片 URL,在 NoSQL 系統(tǒng)中如果需要對(duì) photo_id 建立索引,可以維護(hù)一張分布式表,表的主鍵為形成的二元組。關(guān)系型數(shù)據(jù)庫(kù)由于需要在單機(jī)存儲(chǔ)引擎層面支持索引,大大降低了系統(tǒng)的可擴(kuò)展性,使得單機(jī)存儲(chǔ)引擎的設(shè)計(jì)變得很復(fù)雜。

2、并發(fā)事務(wù)處理。 關(guān)系型數(shù)據(jù)庫(kù)有一整套的關(guān)于事務(wù)并發(fā)處理的理論,比如鎖的粒度是表級(jí)、頁(yè)級(jí)還是行級(jí),多版本并發(fā)控制機(jī)制 MVCC,事務(wù)的隔離級(jí)別,死鎖檢測(cè),回滾,等等。然而,互聯(lián)網(wǎng)應(yīng)用大多數(shù)的特點(diǎn)都是多讀少寫(xiě),比如讀和寫(xiě)的比例是 10:1,并且很少有復(fù)雜事務(wù)需求,因此,一般可以采用更為簡(jiǎn)單的 copy-on-write 技術(shù):單線程寫(xiě),多線程讀,寫(xiě)的時(shí)候執(zhí)行 copy-on-write,寫(xiě)不影響讀服務(wù)。NoSQL 系統(tǒng)這樣的假設(shè)簡(jiǎn)化了系統(tǒng)的設(shè)計(jì),減少了很多操作的 overhead,提高了性能。

3、數(shù)據(jù)結(jié)構(gòu)。 關(guān)系型數(shù)據(jù)庫(kù)的存儲(chǔ)引擎的數(shù)據(jù)結(jié)構(gòu)是一棵磁盤(pán) B+ 樹(shù),為了提高性能,可能需要有 Insert Buffer 聚合寫(xiě),Query Cache 緩存讀,經(jīng)常需要實(shí)現(xiàn)類似 Linux page cache 的緩存管理機(jī)制。數(shù)據(jù)庫(kù)中的讀和寫(xiě)是互相影響的,寫(xiě)操作也因?yàn)闀r(shí)不時(shí)需要將數(shù)據(jù)輸出到磁盤(pán)而性能不高。簡(jiǎn)而言之,關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)引擎的數(shù)據(jù)結(jié)構(gòu)是通用的動(dòng)態(tài)更新的 B+ 樹(shù)。然而,在 NoSQL 系統(tǒng)中,比如 Bigtable 中采用 SSTable+MemTable 的數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)先寫(xiě)入到內(nèi)存的 MemTable,達(dá)到一定大小或者超過(guò)一定時(shí)間才會(huì)備份到磁盤(pán)生成 SSTable 文件, SSTable 是只讀的。如果說(shuō)關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)引擎的數(shù)據(jù)結(jié)構(gòu)是一棵動(dòng)態(tài)的 B+ 樹(shù),那么 SSTable 就是一個(gè)排好序的有序數(shù)組。很明顯,實(shí)現(xiàn)一個(gè)有序數(shù)組比實(shí)現(xiàn)一棵動(dòng)態(tài) B+ 樹(shù)且包含復(fù)雜的并發(fā)控制機(jī)制要簡(jiǎn)單高效得多。

4、Join操作。 關(guān)系型數(shù)據(jù)庫(kù)需要在存儲(chǔ)引擎層面支持 Join,而 NoSQL 系統(tǒng)一般根據(jù)應(yīng)用來(lái)決定 Join 實(shí)現(xiàn)的方式。舉個(gè)例子,有兩張表:用戶表和商品表,每個(gè)用戶下可能有若干個(gè)商品,用戶表的主鍵為 user_id,用戶和商品的關(guān)聯(lián)屬性存放在用戶表中,商品表的主鍵為 item_id,商品屬性包括商品名和商品 URL,等等。假設(shè)應(yīng)用需要查詢一個(gè)用戶的所有商品并顯示商品的詳細(xì)信息,普通的做法是先從用戶表查找指定用戶的所有 item_id,然后對(duì)每個(gè) item_id 去商品表查詢?cè)敿?xì)信息,即執(zhí)行一次數(shù)據(jù)庫(kù) Join 操作,這必然帶來(lái)了很多的磁盤(pán)隨機(jī)讀,并且由于 Join 帶來(lái)的隨機(jī)讀的局部性不好,緩存的效果往往也是有限的。在 NoSQL 系統(tǒng)中,我們往往可以將用戶表和商品表集成到一張寬表中,這樣雖然存儲(chǔ)了額外的信息,但卻換來(lái)了查詢的高效。

1.4 NoSQL 的優(yōu)缺點(diǎn)

業(yè)界為了解決更多用戶的需求,推出了多款新類型的數(shù)據(jù)庫(kù),并且由于它們?cè)谠O(shè)計(jì)上和傳統(tǒng)的 NoSQL 數(shù)據(jù)庫(kù)相比有很大的不同,所以被統(tǒng)稱為 NoSQL 系列數(shù)據(jù)庫(kù)。總的來(lái)說(shuō),在設(shè)計(jì)上,它們非常關(guān)注對(duì)數(shù)據(jù)高并發(fā)讀寫(xiě)和對(duì)海量數(shù)據(jù)的存儲(chǔ)等,與關(guān)系型數(shù)據(jù)庫(kù)相比,它們?cè)诩軜?gòu)和數(shù)據(jù)模型方面做了 減法,而在擴(kuò)展和并發(fā)等方面做了 加法?,F(xiàn)在主流的 NoSQL 數(shù)據(jù)庫(kù)有 BigTableHBase、Cassandra、SimpleDBCouchDB、MongoDBRedis 等。接下來(lái),我們了解一下 NoSQL 數(shù)據(jù)庫(kù)到底存在哪些優(yōu)缺點(diǎn)。在優(yōu)勢(shì)方面,主要體現(xiàn)在下面這三點(diǎn):

1、簡(jiǎn)單的擴(kuò)展。 典型例子是 Cassandra,由于其架構(gòu)是類似于經(jīng)典的 P2P,所以能通過(guò)輕松地添加新的節(jié)點(diǎn)來(lái)擴(kuò)展這個(gè)集群。

2、快速的讀寫(xiě)。 主要例子有 Redis,由于其邏輯簡(jiǎn)單,而且純內(nèi)存操作,使得其性能非常出色,單節(jié)點(diǎn)每秒可以處理超過(guò) 10萬(wàn)次 讀寫(xiě)操作。

3、低廉的成本。 這是大多數(shù)分布式數(shù)據(jù)庫(kù)共有的特點(diǎn),因?yàn)橹饕际情_(kāi)源軟件,沒(méi)有昂貴的許可證成本。雖然有以上優(yōu)勢(shì),但 NoSQL 數(shù)據(jù)庫(kù)還存在著很多的不足,常見(jiàn)的主要有下面這幾個(gè):

1、不提供對(duì) SQL 的支持。 如果不支持 SQL 這樣的工業(yè)標(biāo)準(zhǔn),將會(huì)對(duì)用戶產(chǎn)生一定的學(xué)習(xí)和應(yīng)用遷移成本。

2、支持的特性不夠豐富。 現(xiàn)有產(chǎn)品所提供的功能都比較有限,大多數(shù) NoSQL 數(shù)據(jù)庫(kù)都不支持事務(wù),也不像 SQL ServerOracle 那樣能提供各種附加功能,比如 BI 和報(bào)表等。

3、現(xiàn)有產(chǎn)品的不夠成熟。 大多數(shù)產(chǎn)品都還處于初創(chuàng)期,和關(guān)系型數(shù)據(jù)庫(kù)幾十年的完善不可相提并論。上面 NoSQL 產(chǎn)品的優(yōu)缺點(diǎn)都是共通的,在實(shí)際情況下,每個(gè)產(chǎn)品都會(huì)根據(jù)自己所遵從的數(shù)據(jù)模型和 CAP 理念而有所不同。

1.5 NoSQL 與 SQL 數(shù)據(jù)庫(kù)的比較

在日常的編碼中,我們常用的是 SQL(結(jié)構(gòu)化的查詢語(yǔ)言) 數(shù)據(jù)庫(kù),SQL 是過(guò)去幾十年間存儲(chǔ)數(shù)據(jù)的主要方式?,F(xiàn)在主流的 SQL 主要有 MySQLSQL Server、Oracle 等數(shù)據(jù)庫(kù)。NoSQL 數(shù)據(jù)庫(kù)自從 20世紀(jì)60年代 就已經(jīng)存在了,現(xiàn)在主流的 NoSQLMongoDB、CouchDB、RedisMemcache 等數(shù)據(jù)庫(kù)。SQLNoSQL 有著相同的目標(biāo):存儲(chǔ)數(shù)據(jù)。 但是它們存儲(chǔ)數(shù)據(jù)的方式不同,這可能會(huì)影響到你開(kāi)發(fā)的項(xiàng)目,一種會(huì)簡(jiǎn)化你的開(kāi)發(fā),一種會(huì)阻礙你的開(kāi)發(fā)。盡管目前 NoSQL 數(shù)據(jù)庫(kù)非常火爆,但是 NoSQL 尚不能取代 SQL ——它僅僅是 SQL 的一種替代品。SQLNoSQL 沒(méi)有明顯的區(qū)別。一些 SQL 數(shù)據(jù)庫(kù)也采用了 NoSQL 數(shù)據(jù)庫(kù)的特性,反之亦然。在選擇數(shù)據(jù)庫(kù)方面的界限變得越來(lái)越模糊了,并且一些新的混合型數(shù)據(jù)庫(kù)將會(huì)在不久的將來(lái)提供更多的選擇。SQLNoSQL 的區(qū)別:

  1. SQL 數(shù)據(jù)庫(kù)提供關(guān)系型的表來(lái)存儲(chǔ)數(shù)據(jù),NoSQL 數(shù)據(jù)庫(kù)采用類 JSON 的鍵值對(duì)來(lái)存儲(chǔ)文檔。SQL 中的表結(jié)構(gòu)具有嚴(yán)格的數(shù)據(jù)模式約束,因此存儲(chǔ)數(shù)據(jù)很難出錯(cuò)。NoSQL 存儲(chǔ)數(shù)據(jù)更加靈活自由,但是也會(huì)導(dǎo)致數(shù)據(jù)不一致性問(wèn)題的發(fā)生。
  2. 在 SQL 數(shù)據(jù)庫(kù)中,除非你事先定義了表和字段的模式否則你無(wú)法向其中添加數(shù)據(jù)。在 NoSQL 數(shù)據(jù)庫(kù)中,數(shù)據(jù)在任何時(shí)候都可以進(jìn)行添加,不需要事先去定義文檔和集合。SQL 在進(jìn)行數(shù)據(jù)的邏輯操作之前我們必須要定義數(shù)據(jù)模式,數(shù)據(jù)模式可以在后期進(jìn)行更改,但是對(duì)于模式的大改將會(huì)是非常復(fù)雜的。因此 NoSQL 數(shù)據(jù)庫(kù)更適合于那些不能夠確定數(shù)據(jù)需求的工程項(xiàng)目(MongoDB 會(huì)在集合中為每一個(gè)文檔添加一個(gè)獨(dú)一無(wú)二的id。如果你仍然想要定義索引,你也可以自己在之后定義)。模式中包含了許多的信息:主鍵——獨(dú)一無(wú)二的標(biāo)志就像 ISBN 唯一確定一個(gè)書(shū)號(hào)。索引——通常設(shè)置索引字段加快搜索的速度。關(guān)系——字段之間的邏輯連接。
  3. SQL 具有數(shù)據(jù)庫(kù)的規(guī)范化。NoSQL 雖然可以同樣使用規(guī)范化,但是更傾向于非規(guī)范化。在 SQL 中我們需要增加一張新表 tableB,一張舊表 tableA 關(guān)聯(lián)新表只需使用外鍵 B_id,用于引用 tableB 中的信息,這樣的設(shè)計(jì)能夠最小化數(shù)據(jù)的冗余,我們不需要為 tableA 重復(fù)添加 tableB 的所有信息——只需要去引用就可以了。這項(xiàng)技術(shù)叫作數(shù)據(jù)庫(kù)的規(guī)范化,具有實(shí)際的意義。我們可以更改 tableB 的信息而不用修改 tableA 中的數(shù)據(jù)。而 NoSQL 更多的是在 tableA 中為每項(xiàng)數(shù)據(jù)添加 tableB 的信息,這樣會(huì)使查詢更快,但是在更新信息的記錄變多時(shí)效率將會(huì)顯著下降。
  4. SQL 具有 Join 操作,NoSQL 則沒(méi)有。SQL 語(yǔ)言為查詢提供了強(qiáng)大的 Join 操作。我們可以使用單個(gè) SQL 語(yǔ)句在多個(gè)表中獲取相關(guān)數(shù)據(jù)。而在 NoSQL 中沒(méi)有與 Join 相同的操作,對(duì)于具有 SQL 語(yǔ)言經(jīng)驗(yàn)的人來(lái)說(shuō)是非常令人震驚的,這也是非規(guī)范化存在的原因之一。
  5. SQL 具有數(shù)據(jù)完整性,NoSQL 則不具備數(shù)據(jù)完整性。大多數(shù)的數(shù)據(jù)庫(kù)允許通過(guò)定義外鍵來(lái)進(jìn)行數(shù)據(jù)庫(kù)的完整性約束。在 NoSQL 數(shù)據(jù)庫(kù)中則沒(méi)有數(shù)據(jù)完整性的約束選項(xiàng),你可以存儲(chǔ)任何你想要存儲(chǔ)的數(shù)據(jù)。理想情況下,單個(gè)文檔將是項(xiàng)目所有信息的唯一來(lái)源。
  6. SQL 需要自定義事務(wù)。NoSQL 操作單個(gè)文檔時(shí)具備事務(wù)性,而操作多個(gè)文檔時(shí)則不具備事務(wù)性。在 SQL 數(shù)據(jù)庫(kù)中,兩條或者多條更新操作可以結(jié)合成一個(gè) 事務(wù)(或者全部執(zhí)行成功否則失敗) 執(zhí)行。將兩條更新操作綁定為一個(gè)事務(wù)確保了它們要么全部成功要么全部失敗。在 NoSQL 數(shù)據(jù)庫(kù)中,對(duì)于一個(gè)文檔的更新操作是原子性的。換句話說(shuō),如果你要更新一個(gè)文檔中的三個(gè)值,要么三個(gè)值都更新成功要么它們保持不變。然而,對(duì)于操作多個(gè)文檔時(shí)沒(méi)有與事務(wù)相對(duì)應(yīng)的操作。在 MongoDB 中有一個(gè)操作是 transaction-like options,但是,需要我們手動(dòng)地加入到代碼中。
  7. SQL 使用 SQL 語(yǔ)言,NoSQL 使用類 JSON。SQL 是一種聲明性語(yǔ)言。SQL 語(yǔ)言的功能強(qiáng)大,并且已經(jīng)成為了一種國(guó)際的通用標(biāo)準(zhǔn),盡管大多數(shù)系統(tǒng)在語(yǔ)法上有一些細(xì)微的差別。NoSQL 數(shù)據(jù)庫(kù)使用類似 JSON 為參數(shù)的 JavaScript 來(lái)進(jìn)行查詢,基本操作是相同的,但是嵌套的 JSON 將會(huì)產(chǎn)生復(fù)雜的查詢。
  8. NoSQL 比 SQL 更快。通常情況下,NoSQL 比 SQL 語(yǔ)言更快。這并沒(méi)有什么好震驚的,NoSQL 中更加簡(jiǎn)單的非規(guī)范化存儲(chǔ)允許我們?cè)谝淮尾樵冎械玫教囟?xiàng)的所有信息,不需要使用 SQL 中復(fù)雜的 Join 操作。也就是說(shuō),你的項(xiàng)目的設(shè)計(jì)和數(shù)據(jù)的需求會(huì)有很大的影響。一個(gè)好的 SQL 數(shù)據(jù)庫(kù)一定會(huì)比一個(gè)不好的 NoSQL 數(shù)據(jù)庫(kù)性能好很多,反之亦然。

二、MongoDB 基礎(chǔ)知識(shí)

MongoDB 是一個(gè)跨平臺(tái)的、面向文檔的數(shù)據(jù)庫(kù),是當(dāng)前 NoSQL 數(shù)據(jù)庫(kù)產(chǎn)品中最熱門(mén)的一種。下面我們來(lái)認(rèn)識(shí)一下 MongoDB。

2.1 MongoDB 是什么

MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫(xiě)。旨在為 Web 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB 是一個(gè)介于關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系型數(shù)據(jù)庫(kù)當(dāng)中功能最豐富、最像關(guān)系型數(shù)據(jù)庫(kù)的。它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似 JSON 的 BSON 格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型。MongoDB 最大的特點(diǎn)是它支持的查詢語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。

2.2 MongoDB 的體系結(jié)構(gòu)

MongoDB 的邏輯結(jié)構(gòu)是一種層次結(jié)構(gòu),主要由 文檔(document)、集合(collection)、數(shù)據(jù)庫(kù)(database) 這三部分組成。邏輯結(jié)構(gòu)是面向用戶的,用戶使用 MongoDB 開(kāi)發(fā)應(yīng)用程序使用的就是邏輯結(jié)構(gòu):

  1. MongoDB 的文檔,相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中的一行記錄。
  2. 多個(gè)文檔組成一個(gè)集合,相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)的表。
  3. 多個(gè)集合邏輯上組織在一起,就是數(shù)據(jù)庫(kù)。
  4. 一個(gè) MongoDB 實(shí)例支持多個(gè)數(shù)據(jù)庫(kù)。

文檔、集合、數(shù)據(jù)庫(kù)的層次結(jié)構(gòu)如下圖所示:

2.3 MongoDB 的特點(diǎn)

MongoDB 最大的特點(diǎn)是它支持的查詢語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。它是一個(gè)面向集合的,模式自由的文檔型數(shù)據(jù)庫(kù)。具體特點(diǎn)總結(jié)如下:

  1. 面向集合存儲(chǔ),易于存儲(chǔ)對(duì)象類型的數(shù)據(jù)。
  2. 模式自由。
  3. 支持動(dòng)態(tài)查詢。
  4. 支持完全索引,包含內(nèi)部對(duì)象。
  5. 支持復(fù)制和故障恢復(fù)。
  6. 使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ),包括大型對(duì)象(如視頻等)。
  7. 自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展性。
  8. 支持 Python、PHP、Ruby、Java、C、C#、JavaScript、Perl 及 C++ 語(yǔ)言的驅(qū)動(dòng)程序,社區(qū)中也提供了對(duì) Erlang 及 .NET 等平臺(tái)的驅(qū)動(dòng)程序。
  9. 文件存儲(chǔ)格式為 BSON(一種JSON的擴(kuò)展)。

2.4 MongoDB 鍵特性

MongoDB 的設(shè)計(jì)目標(biāo)是高性能、可擴(kuò)展、易部署、易使用,存儲(chǔ)數(shù)據(jù)非常方便,其主要功能特性如下:

1、文檔數(shù)據(jù)類型。 SQL 類型的數(shù)據(jù)庫(kù)是正規(guī)化的,可以通過(guò)主鍵或者外鍵的約束保證數(shù)據(jù)的完整性與唯一性,所以 SQL 類型的數(shù)據(jù)庫(kù)常用于對(duì)數(shù)據(jù)完整性要求較高的系統(tǒng)。MongoDB 在這一方面是不如 SQL 類型的數(shù)據(jù)庫(kù)的,且 MongoDB 沒(méi)有固定的 Schema,正因?yàn)?MongoDB 少了一些這樣的約束條件,可以讓數(shù)據(jù)的存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)更靈活,存儲(chǔ)速度更快。

2、即時(shí)查詢能力。 MongoDB 保留了關(guān)系型數(shù)據(jù)庫(kù)即時(shí)查詢的能力,保留了索引(底層是基于B樹(shù))的能力。這一點(diǎn)汲取了關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)點(diǎn),同類型的 NoSQL Redis 則沒(méi)有上述的能力。

3、復(fù)制能力。 MongoDB 自身提供了副本集能將數(shù)據(jù)分布在多臺(tái)機(jī)器上實(shí)現(xiàn)冗余,目的是可以提供自動(dòng)故障轉(zhuǎn)移、擴(kuò)展讀能力。

4、速度與持久性。 MongoDB 的驅(qū)動(dòng)實(shí)現(xiàn)一個(gè)寫(xiě)入語(yǔ)義 fire and forget,即通過(guò)驅(qū)動(dòng)調(diào)用寫(xiě)入時(shí),可以立即得到返回成功的結(jié)果(即使是報(bào)錯(cuò)),這樣讓寫(xiě)入的速度更快,當(dāng)然會(huì)有一定的不安全性,完全依賴網(wǎng)絡(luò)。

5、數(shù)據(jù)擴(kuò)展。 MongoDB 使用分片技術(shù)對(duì)數(shù)據(jù)進(jìn)行擴(kuò)展,MongoDB 能自動(dòng)分片、自動(dòng)轉(zhuǎn)移分片里面的數(shù)據(jù)塊,讓每一個(gè)服務(wù)器里面存儲(chǔ)的數(shù)據(jù)都是一樣大小。

2.5 MongoDB 的核心服務(wù)和工具

MongoDB 是用 C++ 編寫(xiě)的,由 10gen 積極維護(hù)。該項(xiàng)目能在所有主流操作系統(tǒng)上編譯,包括 Mac OS X、Windows 和大多數(shù) Linux。MongoDB.org 上提供了這些平臺(tái)的預(yù)編譯二進(jìn)制包。MongoDB 是開(kāi)源的,遵循 GNU-AGPL 許可,GitHub 上可以免費(fèi)獲取到源代碼,而且經(jīng)常會(huì)接受來(lái)自社區(qū)的貢獻(xiàn),但這一項(xiàng)目主要還是由 10gen 的核心服務(wù)器團(tuán)隊(duì)來(lái)領(lǐng)導(dǎo)的,絕大多數(shù)提交亦來(lái)自該團(tuán)隊(duì)。

1、核心服務(wù)器。 通過(guò)可執(zhí)行文件 mongod(Windows 上是 MongoDB.exe)可以運(yùn)行核心服務(wù)器。mongod 服務(wù)器進(jìn)程使用一個(gè)自定義的二進(jìn)制協(xié)議從網(wǎng)絡(luò)套接字上接收命令。mongod 進(jìn)程的所有數(shù)據(jù)文件默認(rèn)都存儲(chǔ)在 /data/db 里。mongod 有多種運(yùn)行模式,最常見(jiàn)的是作為副本集中的一員。因?yàn)橥扑]使用復(fù)制,通常副本集由兩個(gè)副本組成,再加一個(gè)部署在第三臺(tái)服務(wù)器上的仲裁進(jìn)程。對(duì)于 MongoDB 的自動(dòng)分片架構(gòu)而言,其組件包含配置為預(yù)先分片的副本集的 mongod 進(jìn)程,以及特殊的元數(shù)據(jù)服務(wù)器,稱為配置服務(wù)器。另外還有單獨(dú)的名為 mongos 的路由服務(wù)器向適當(dāng)?shù)姆制l(fā)送請(qǐng)求。相比其他的數(shù)據(jù)庫(kù)系統(tǒng),例如 MySQL,配置一個(gè) mongod 進(jìn)程相對(duì)比較簡(jiǎn)單。雖然可以指定標(biāo)準(zhǔn)端口和數(shù)據(jù)目錄,但沒(méi)有什么調(diào)優(yōu)數(shù)據(jù)庫(kù)的選項(xiàng)。在大多數(shù) RDBMS 中,數(shù)據(jù)庫(kù)調(diào)優(yōu)意味著通過(guò)一大堆參數(shù)來(lái)控制內(nèi)存分配等內(nèi)容,這已經(jīng)變成了一門(mén)黑魔法。MongoDB 的設(shè)計(jì)哲學(xué)指出,內(nèi)存管理最好是由操作系統(tǒng)而非 DBA 或應(yīng)用程序開(kāi)發(fā)者來(lái)處理。如此一來(lái),數(shù)據(jù)文件通過(guò) mmap() 系統(tǒng)調(diào)用被映射成了系統(tǒng)的虛擬內(nèi)存。這一舉措行之有效地將內(nèi)存管理的重任交給了操作系統(tǒng)內(nèi)核。后續(xù)還會(huì)更多地闡述與 mmap() 相關(guān)的內(nèi)容,不過(guò)目前只需要知道缺少配置參數(shù)是系統(tǒng)設(shè)計(jì)亮點(diǎn),而非缺陷。

2、JavaScript Shell。 MongoDB 命令行 Shell 是一個(gè)基于 JavaScript 的工具,用于管理數(shù)據(jù)庫(kù)和操作數(shù)據(jù)。可執(zhí)行文件 mongod 會(huì)加載 Shell 并連接到指定的 mongod 進(jìn)程。MongoDB Shell 的功能和 MySQL Shell 差不多,主要的區(qū)別在于不使用 SQL,大多數(shù)命令使用的是 JavaScript 表達(dá)式。除了可以插入和查詢數(shù)據(jù),Shell 還可以用于運(yùn)行管理命令。例如,查看當(dāng)前數(shù)據(jù)庫(kù)操作、檢查到從節(jié)點(diǎn)的復(fù)制狀態(tài),以及配置一個(gè)用于分片的集合。

3.數(shù)據(jù)庫(kù)驅(qū)動(dòng)。 MongoDB 的驅(qū)動(dòng)很容易使用,MongoDB 團(tuán)隊(duì)竭盡全力提供符合特定語(yǔ)言風(fēng)格的 API,并同時(shí)保持跨語(yǔ)言、相對(duì)統(tǒng)一的接口。例如,所有驅(qū)動(dòng)都實(shí)現(xiàn)了向集合保存文檔的方法,但不同語(yǔ)言里文檔本身的表述通常會(huì)有所不同,驅(qū)動(dòng)盡量會(huì)對(duì)特定語(yǔ)言表現(xiàn)得更自然一些。例如,在 Ruby 中就是使用一個(gè) Ruby 散列,在 Python 中字典更合適一點(diǎn),Java 中缺少類似的語(yǔ)言原語(yǔ),需要使用 LinkedHashMap 類實(shí)現(xiàn)的特殊文檔來(lái)表示文檔。由于驅(qū)動(dòng)程序?yàn)閿?shù)據(jù)庫(kù)開(kāi)發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的 API,因此可以構(gòu)建更高級(jí)的工具和接口。數(shù)據(jù)庫(kù)開(kāi)發(fā)人員使用 Java API 編寫(xiě)的數(shù)據(jù)庫(kù)應(yīng)用程序,不但可以跨平臺(tái)運(yùn)行,而且還不受數(shù)據(jù)庫(kù)供應(yīng)商的限制。這與使用 RDBMS 的應(yīng)用程序設(shè)計(jì)截然不同,在數(shù)據(jù)庫(kù)的關(guān)系型數(shù)據(jù)模型和大多數(shù)現(xiàn)代編程語(yǔ)言的面向?qū)ο竽P椭g幾乎都需要有一個(gè)庫(kù)來(lái)做中介。雖然不需要 對(duì)象關(guān)系映射器(object-relational mapper),但很多開(kāi)發(fā)者都喜歡在驅(qū)動(dòng)上做一層薄薄的封裝,用它來(lái)處理關(guān)聯(lián)、驗(yàn)證和類型檢查。

4、命令行工具。 MongoDB 自帶了很多命令行工具。mongodump 和 mongorestore:備份和恢復(fù)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)工具。mongodump 用原生的 BSON 格式將數(shù)據(jù)庫(kù)的數(shù)據(jù)保存下來(lái),因此最好只是用來(lái)做備份,其優(yōu)勢(shì)是熱備時(shí)非常有用,備份后能方便地用 mongorestore 恢復(fù)。mongoexport 和 mongoimport:用來(lái)導(dǎo)入導(dǎo)出 JSON、CSV 和 TSV 數(shù)據(jù),數(shù)據(jù)需要支持多種格式時(shí)很有用。mongoimport 還能用于大數(shù)據(jù)集的初始導(dǎo)入,但是在導(dǎo)入前順便還要注意一下,為了能充分利用好 MongoDB 通常需要對(duì)數(shù)據(jù)模型做些調(diào)整。在這種情況下,通過(guò)使用驅(qū)動(dòng)的自定義腳本來(lái)導(dǎo)入數(shù)據(jù)會(huì)更方便一些。mongosniff:這是一個(gè)網(wǎng)絡(luò)嗅探工具,用來(lái)觀察發(fā)送到數(shù)據(jù)庫(kù)的操作?;揪褪前丫W(wǎng)絡(luò)上傳輸?shù)?BSON 轉(zhuǎn)換為易于人們閱讀的 Shell 語(yǔ)句。mongostat:它與 iostat 類似,持續(xù)輪詢 MongoDB 和系統(tǒng)以便提供有幫助的統(tǒng)計(jì)信息,包括每秒操作數(shù)(插入、查詢、更新、刪除等)、分配的虛擬內(nèi)存數(shù)量以及服務(wù)器的連接數(shù)。

2.6 MongoDB 應(yīng)用場(chǎng)景

MongoDB 的主要目標(biāo)是在鍵值存儲(chǔ)方式(提供了高性能和高度伸縮性)和傳統(tǒng)的 RDBMS 系統(tǒng)(具有豐富的功能)之間架起一座橋梁,它集兩者的優(yōu)勢(shì)于一身。根據(jù)官方網(wǎng)站的描述,MongoDB 適用于以下場(chǎng)景:

  1. 網(wǎng)站數(shù)據(jù):MongoDB 非常適合實(shí)時(shí)的插入、更新與查詢,并具備網(wǎng)站實(shí)時(shí)數(shù)據(jù)存儲(chǔ)所需的復(fù)制及高度伸縮性。
  2. 緩存:由于性能很高,MongoDB 也適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟之后,由 MongoDB 搭建的持久化緩存層可以避免下層的數(shù)據(jù)源過(guò)載。
  3. 大尺寸、低價(jià)值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)一些數(shù)據(jù)時(shí)可能會(huì)比較昂貴,在此之前,很多時(shí)候程序員往往會(huì)選擇傳統(tǒng)的文件進(jìn)行存儲(chǔ)。
  4. 高伸縮性的場(chǎng)景:MongoDB 非常適合由數(shù)十或數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫(kù),MongoDB 的路線圖中已經(jīng)包含對(duì) MapReduce 引擎的內(nèi)置支持。
  5. 用于對(duì)象及 JSON 數(shù)據(jù)的存儲(chǔ):MongoDB 的 BSON 數(shù)據(jù)格式非常適合文檔化格式的存儲(chǔ)及查詢。MongoDB 的使用也會(huì)有一些限制,例如,它不適合于以下幾個(gè)地方:
    高度事務(wù)性的系統(tǒng):例如,銀行或會(huì)計(jì)系統(tǒng)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)目前還是更適用于需要大量原子性復(fù)雜事務(wù)的應(yīng)用程序。
    傳統(tǒng)的商業(yè)智能應(yīng)用:針對(duì)特定問(wèn)題的BI數(shù)據(jù)庫(kù)會(huì)產(chǎn)生高度優(yōu)化的查詢方式。對(duì)于此類應(yīng)用,數(shù)據(jù)倉(cāng)庫(kù)可能是更合適的選擇。
    

2.7 MongoDB 數(shù)據(jù)模型

對(duì)于 MongoDB 而言,本身數(shù)據(jù)格式非常靈活,即在同一個(gè) Collection 中,不同的 Document 的格式也無(wú)需一致。但是,在實(shí)際使用中,我們首先也會(huì)對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行一些基本的設(shè)計(jì)。同時(shí),MongoDB 本身也提供了一些與數(shù)據(jù)模型相關(guān)的功能,可以用于驗(yàn)證數(shù)據(jù)格式等信息,下面將會(huì)講解 MongoDB 的數(shù)據(jù)模型。

2.7.1 數(shù)據(jù)模型

MongoDB 的數(shù)據(jù)模式是一種靈活模式。關(guān)系型數(shù)據(jù)庫(kù)要求你在插入數(shù)據(jù)之前必須先定義好一個(gè)表的模式結(jié)構(gòu),而 MongoDB 的集合則并不限制 document 結(jié)構(gòu)。這種靈活性讓對(duì)象和數(shù)據(jù)庫(kù)文檔之間的映射變得很容易。即使數(shù)據(jù)記錄之間有很大的變化,每個(gè)文檔也可以很好地映射到各條不同的記錄。當(dāng)然在實(shí)際使用中,同一個(gè)集合中的文檔往往都有一個(gè)比較類似的結(jié)構(gòu)。

1、文檔結(jié)構(gòu)。 MongoDB 是面向集合存儲(chǔ)的文檔型數(shù)據(jù)庫(kù),其涉及到的基本概念與關(guān)系型數(shù)據(jù)庫(kù)有所不同,如下表所示:
請(qǐng)?zhí)砑訄D片描述
文檔是 MongoDB 最核心的概念,本質(zhì)上是一種類 JSON 的 BSON 格式的數(shù)據(jù)。BSON 是一種類 JSON 的二進(jìn)制格式的數(shù)據(jù),它可以理解為在 JSON 基礎(chǔ)上添加了一些新的數(shù)據(jù)類型,包括 日期、int32、int64 等。BSON 是由一組組鍵值對(duì)組成,它具有輕量性、可遍歷性和高效性三個(gè)特征。

2、嵌套與引用。 文檔的數(shù)據(jù)模型代表了數(shù)據(jù)的組織結(jié)構(gòu),一個(gè)好的數(shù)據(jù)模型能更好地支持應(yīng)用程序。在 MongoDB 中,文檔有兩種數(shù)據(jù)模型,內(nèi)嵌(embed)引用(references)。

內(nèi)嵌: 內(nèi)嵌方式指的是把相關(guān)聯(lián)的數(shù)據(jù)保存在同一個(gè)文檔結(jié)構(gòu)之內(nèi)。MongoDB 的文檔結(jié)構(gòu)允許一個(gè)字段或者一個(gè)數(shù)組內(nèi)的值為一個(gè)嵌套的文檔。這種冗余的數(shù)據(jù)模型可以讓?xiě)?yīng)用程序在一個(gè)數(shù)據(jù)庫(kù)操作內(nèi)完成對(duì)相關(guān)數(shù)據(jù)的讀取或修改。嵌套型的使用方式如下圖所示:

內(nèi)嵌類型支持一組相關(guān)的數(shù)據(jù)存儲(chǔ)在一個(gè)文檔中,這樣的好處就是,應(yīng)用程序可以通過(guò)比較少的查詢和更新操作來(lái)完成一些常規(guī)的數(shù)據(jù)的查詢和更新工作。通常,對(duì)于一對(duì)一關(guān)系或者簡(jiǎn)單的一對(duì)多的關(guān)系,我們會(huì)使用嵌套型數(shù)據(jù)。
引用: 引用方式通過(guò)存儲(chǔ)鏈接或者引用信息來(lái)實(shí)現(xiàn)兩個(gè)不同文檔之間的關(guān)聯(lián)。應(yīng)用程序可以通過(guò)解析這些數(shù)據(jù)庫(kù)引用來(lái)訪問(wèn)相關(guān)數(shù)據(jù)。簡(jiǎn)單來(lái)講,這就是規(guī)范化的數(shù)據(jù)模型。引用型的使用方式如下圖所示:

在這個(gè)模型中,把 contact 和 access從user 中移出,并通過(guò) user_id 作為索引來(lái)表示它們之間的聯(lián)系。對(duì)于引用型關(guān)系而言,不同 Collection 之間通過(guò) _id 進(jìn)行關(guān)聯(lián),從而最終組合獲得整體的數(shù)據(jù)。

通常,對(duì)于多對(duì)多關(guān)系或者復(fù)雜的一對(duì)多的關(guān)系,我們會(huì)使用引用型數(shù)據(jù),因?yàn)殡S著單條數(shù)據(jù)量的增加,性能將會(huì)有所下降。

3、原子寫(xiě)操作。 在 MongoDB 中,寫(xiě)操作在文檔級(jí)別上是原執(zhí)行的,沒(méi)有一個(gè)單一的寫(xiě)操作可以對(duì)原子的影響多于一個(gè)文檔或者是集合。一個(gè)包含嵌入式數(shù)據(jù)非標(biāo)準(zhǔn)化的數(shù)據(jù)模型和相關(guān)的數(shù)據(jù)代表了一個(gè)單一的文檔。這些有利于原子寫(xiě)操作,因?yàn)閷?duì)一個(gè)實(shí)體一個(gè)單一的寫(xiě)操作可以插入或者更新數(shù)據(jù),標(biāo)準(zhǔn)化數(shù)據(jù)將把數(shù)據(jù)分散在多個(gè)集合中,這樣就會(huì)要求多個(gè)寫(xiě)操作,也就是說(shuō)不是集體原子執(zhí)行。但是,有利于原子寫(xiě)的模式或許會(huì)限制應(yīng)用程序可以使用的數(shù)據(jù)或者限制修改應(yīng)用的方法,原子性地考慮文檔描述了設(shè)計(jì)模式平衡靈活性和原子性的挑戰(zhàn)。

4、文檔增長(zhǎng)。 一些更新,例如一些增加域或者在數(shù)組中增加元素,都會(huì)加大文檔的大小。對(duì)于 MMAPv1 存儲(chǔ)引擎,如果文檔的大小超過(guò)為文檔分配的空間的大小,MongoDB 將會(huì)在文檔上遷移文檔,當(dāng)我們使用 MMAPv1 存儲(chǔ)引擎時(shí),文檔的大小可以影響標(biāo)準(zhǔn)化與非標(biāo)準(zhǔn)化數(shù)據(jù)的決策。

2.7.2 多態(tài)模式

MongoDB 又被稱為 無(wú)模式 的數(shù)據(jù)庫(kù),它不強(qiáng)制要求集合的文檔擁有特定的結(jié)構(gòu)。不考慮應(yīng)用的結(jié)構(gòu),將應(yīng)用中每個(gè)對(duì)象存儲(chǔ)在相同的集合是合法的,盡管效率上存在問(wèn)題。然而優(yōu)秀的應(yīng)用中常見(jiàn)的情景是集合會(huì)包含完全相關(guān)或密切關(guān)聯(lián)的文檔結(jié)構(gòu)。當(dāng)集合中所有文檔結(jié)構(gòu)都是類似的,但不是完全相同的稱之為多態(tài)模式。

1、多態(tài)模式支持面向?qū)ο缶幊獭?/strong> 面向?qū)ο缶幊讨?#xff0c;習(xí)慣通過(guò)繼承使得不同對(duì)象共享數(shù)據(jù)和行為。面向?qū)ο笳Z(yǔ)言允許函數(shù)像操作父類一樣操作子類,調(diào)用在父類中定義的方法。

2、多態(tài)模式使得模式進(jìn)化成為可能。 開(kāi)發(fā)數(shù)據(jù)庫(kù)驅(qū)動(dòng)應(yīng)用時(shí),程序員有一個(gè)需要考慮的事情就是模式進(jìn)化。典型的是使用遷移腳本將數(shù)據(jù)庫(kù)從一個(gè)模式升級(jí)為另一個(gè)。在應(yīng)用配置在線數(shù)據(jù)前,遷移操作可能包含刪除數(shù)據(jù)庫(kù)并使用新的模式重新創(chuàng)建數(shù)據(jù)庫(kù)。然而,一旦應(yīng)用是在線時(shí),模式更改需通過(guò)復(fù)雜的遷移腳本來(lái)實(shí)現(xiàn)在保存內(nèi)容的同時(shí)更改格式。關(guān)系型數(shù)據(jù)庫(kù)通過(guò) ALTER TABLE 語(yǔ)句來(lái)支持遷移,可使用它添加或刪除列。ALTER TABLE 語(yǔ)句最大的缺陷在于處理大量行數(shù)據(jù)的表時(shí)會(huì)十分耗時(shí),而且在遷移的時(shí)候應(yīng)用需下線,因?yàn)?ALTER TABLE 需鎖定數(shù)據(jù)表文檔來(lái)執(zhí)行遷移。

3、BSON 的存儲(chǔ)效率。 MongoDB 有一個(gè)主要的特點(diǎn)是缺乏強(qiáng)制模式(存儲(chǔ)效率),RDBMS 中列名和類型格式在表級(jí)定義,因此無(wú)須在行級(jí)重復(fù)該信息。對(duì)比 MongoDB 來(lái)說(shuō),不知道在集合級(jí)別每個(gè)文檔有哪些字段,也不知道這些字段的類型,因此每個(gè)文檔都需要存儲(chǔ)字段名和類型。特別是在文檔中存儲(chǔ)一個(gè)較小的值(整型、日期、短字符、…),并使用很長(zhǎng)的屬性名時(shí),MongoDB 將造成使用比 RDBMS 更多的存儲(chǔ)空間存儲(chǔ)相同的數(shù)據(jù)。一種減輕影響的方法是在 MongoDB 中的文檔上使用短字段名,但該方法會(huì)導(dǎo)致很難在 Shell 中直接查看數(shù)據(jù)庫(kù)。

三、MongoDB 的安裝配置及可視化工具

https://blog.csdn.net/xw1680/article/details/127626145
https://blog.csdn.net/xw1680/article/details/126659241

四、MongoDB 數(shù)據(jù)庫(kù)管理

本小節(jié)主要講解 MongoDB shell 的基礎(chǔ)知識(shí)以及可視化工具如何使用它們來(lái)管理數(shù)據(jù)庫(kù)。在深入探究創(chuàng)建與數(shù)據(jù)庫(kù)交互的應(yīng)用程序之前,理解 MongoDB shell 如何工作是很重要的。通過(guò)本小節(jié)的學(xué)習(xí),我們可以學(xué)習(xí)到怎么使用 shell 命令去操作使用數(shù)據(jù)庫(kù)。

4.1 MongoDB shell

MongoDB shell 是 MongoDB 自帶的 JavaScript shell,隨 MongoDB 一同發(fā)布,它是 MongoDB 客戶端工具,可以在 shell 中使用命令與 MongoDB 進(jìn)行交互,對(duì)數(shù)據(jù)庫(kù)的管理操作(CURD、集群配置、狀態(tài)查看等)都可以通過(guò) MongoDB shell 來(lái)完成。

MongoDB shell 是 MongoDB 自帶的一個(gè)交互式的 JavaScript shell,可以使用 MongoDB shell 訪問(wèn)、配置、管理 MongoDB 數(shù)據(jù)庫(kù)??梢哉f(shuō)使用 MongoDB shell,就可以管理 MongoDB 的一切。一旦開(kāi)啟了數(shù)據(jù)庫(kù)服務(wù),就可以啟動(dòng) MongoDB shell 并且開(kāi)始使用 MongoDB。想要使用 MongoDB shell,首先需要啟動(dòng) MongoDB。然后進(jìn)入到 MongoDB 安裝目錄的bin目錄,輸入 MongoDB shell 的連接命令,其命令格式如下所示:

# ip是要連接的數(shù)據(jù)庫(kù)所在的ip地址,若不填,則默認(rèn)localhost即127.0.0.1。
mongo [ip][:port][/database] [--username "username" --password "password"]
# port是要連接的數(shù)據(jù)庫(kù)的端口號(hào),若不填,則默認(rèn)27017。
# /database是要連接的MongoDB的哪一個(gè)數(shù)據(jù)庫(kù),如果不填,則默認(rèn)連接test數(shù)據(jù)庫(kù)。
#[--username "username" --password "password"],則是如果數(shù)據(jù)庫(kù)在啟動(dòng)時(shí)使用--auth開(kāi)啟了身份驗(yàn)證,則需要輸入用戶名和密碼

注意:不要把這個(gè)命令和啟動(dòng) MongoDB 的命令混淆了,一個(gè)是 mongod 命令,一個(gè)是 mongo 命令。接下來(lái)連接 MongoDB shell,如下圖所示:
在這里插入圖片描述
另外的寫(xiě)法:

D:\DevelopSoftware\MongoDB\bin>mongo localhost:27017/test

4.2 MongoDB shell 命令

  1. help 命令: 如果想知道某個(gè)對(duì)象下都有哪些函數(shù)可以使用 help 命令,直接使用 help 會(huì)列舉出 MongoDB 支持操作,使用 db.help() 會(huì)列舉所有 db 對(duì)象所支持的操作,使用 db.mycoll.help() 可以列舉所有集合對(duì)象對(duì)應(yīng)的操作。
    db.help()  # 查看所有數(shù)據(jù)級(jí)別的操作
    db.mycoll.help()  # 查看集合級(jí)別的操作
    db.listCommands()  # 列舉數(shù)據(jù)庫(kù)命令
    
  2. 可以通過(guò)輸入函數(shù)名查看函數(shù)方法的實(shí)現(xiàn)或者查看方法的定義(比如忘記函數(shù)的參數(shù)了),不帶小括號(hào),代碼如下:
    在這里插入圖片描述

4.3 MongoDB shell 原生方法

MongoDB shell 提供了很多用于執(zhí)行管理的原生方法,我們可以在 MongoDB shell 中直接調(diào)用,也可以在 js 文件中直接調(diào)用,然后使用 shell 執(zhí)行 js 文件即可。下面我們看一些常用的原生方法:

Date()方法。若直接使用Date()方法,則直接返回當(dāng)前日期字符串
UUID(hex_string)方法。將32B的十六進(jìn)制字符串轉(zhuǎn)換成BSON子類型的UUID格式。
ObjectId.valueOf()方法。將一個(gè)ObjectId的屬性str顯示為十六進(jìn)制字符串。
Mongo.getDB(DataBase)方法。返回一個(gè)數(shù)據(jù)庫(kù)對(duì)象,它標(biāo)識(shí)指定的數(shù)據(jù)庫(kù)。
Mongo(host:port)方法。創(chuàng)建一個(gè)連接對(duì)象,它連接到指定的主機(jī)和端口。
connect(string)方法。連接到指定MongoDB實(shí)例中的指定數(shù)據(jù)庫(kù),返回一個(gè)數(shù)據(jù)庫(kù)對(duì)象,string的格式為:
host:port/database,如db=connect("localhost:27017/test"),該語(yǔ)法等同于Mongo(host:port).getDB(database)。cat(path)方法。與Linux差不多,返回指定路徑的文件的內(nèi)容。
version()方法。返回當(dāng)前MongoDB shell的版本。
cd(path)方法。將工作目錄切換到指定路徑。
getMemInfo()方法。返回當(dāng)前shell占用的內(nèi)存量。
hostname()方法。返回運(yùn)行當(dāng)前MongoDB shell的系統(tǒng)的主機(jī)名。
load(path)方法。在shell中加載并運(yùn)行參數(shù)path指定的js文件。
_rand()方法。返回一個(gè)0~1的隨機(jī)數(shù)。

4.4 MongoDB 的基本操作

MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,也是非關(guān)系型數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系型數(shù)據(jù)庫(kù)的。MongoDB 的操作和 MySQL 中的操作很相像,使用過(guò) MySQL 的人群也能很快適應(yīng) MongoDB 中的操作。

4.4.1 MongoDB 數(shù)據(jù)庫(kù)的連接

見(jiàn) 4.1 小節(jié)

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

數(shù)據(jù)庫(kù)是以一定方式儲(chǔ)存在一起、能與多個(gè)用戶共享、具有盡可能小的冗余度、與應(yīng)用程序彼此獨(dú)立的數(shù)據(jù)集合,可視為電子化的文件柜——存儲(chǔ)電子文件的處所,用戶可以對(duì)文件中的數(shù)據(jù)進(jìn)行新增、查詢、更新、刪除等操作。數(shù)據(jù)庫(kù)是集合和索引的命名空間和物理分組。MongoDB 沒(méi)有顯式地創(chuàng)建數(shù)據(jù)庫(kù)的方式,而是會(huì)在第一次寫(xiě)入數(shù)據(jù)時(shí)創(chuàng)建數(shù)據(jù)庫(kù)。創(chuàng)建數(shù)據(jù)庫(kù)時(shí),MongoDB 會(huì)在磁盤(pán)上分配一系列數(shù)據(jù)庫(kù)文件集合,包括所有的集合、索引以及其他元數(shù)據(jù)。數(shù)據(jù)庫(kù)文件存儲(chǔ)在 mongod 啟動(dòng)時(shí)的 dbpath 參數(shù)指定的目錄文件夾中,如果不指定 dbpath,則會(huì)默認(rèn)在 /data/db 文件夾下存儲(chǔ)。

首先查看所有數(shù)據(jù)庫(kù):> show dbs;
創(chuàng)建/切換數(shù)據(jù)庫(kù)newdb:use newdb; 有數(shù)據(jù)才會(huì)真正的創(chuàng)建
獲取當(dāng)前正在操作的數(shù)據(jù)庫(kù):db
刪除數(shù)據(jù)庫(kù):db.dropDatabase()

4.4.3 集合

集合是結(jié)構(gòu)或者概念上相似的文檔的容器。MongoDB 創(chuàng)建集合是隱式的,在插入文檔的時(shí)候才會(huì)創(chuàng)建。但因?yàn)橛卸嘀丶项愋偷拇嬖?#xff0c;所以也提供了創(chuàng)建集合的命令:

db.createCollection("users")

從 MongoDB 內(nèi)部來(lái)講,集合名字是通過(guò)其命名空間名字來(lái)區(qū)分的,包含所屬的數(shù)據(jù)庫(kù)的名字。在 MongoDB 中使用 createCollection() 方法來(lái)創(chuàng)建集合。語(yǔ)法格式如下:

db.createCollection(name, options)

name:要?jiǎng)?chuàng)建的集合名稱。options:可選參數(shù),指定有關(guān)內(nèi)存大小及索引的選項(xiàng),其中 options 參數(shù)可以是下表所示的類型:請(qǐng)?zhí)砑訄D片描述
示例:

> use test
switched to db test
> db.createCollection("newdb") 當(dāng)插入數(shù)據(jù)時(shí)會(huì)自動(dòng)創(chuàng)建
{ "ok" : 1 }
> show collections  查看已有集合
newdb
> db.createCollection("newdb2",{capped : true, autoIndexId : true, size :5000000, max : 1000})
{"note" : "The autoIndexId option is deprecated and will be removed in a future release","ok" : 1
}
> db.newdb2.drop()
true
> show collections
newdb
> db.newdb.renameCollection("temp")
{ "ok" : 1 }
> show collections
temp

4.4.4 文檔

文檔是一組鍵值(key-value)對(duì)。MongoDB 的文檔不需要設(shè)置相同的字段,并且相同的字段不需要相同的數(shù)據(jù)類型,這與關(guān)系型數(shù)據(jù)庫(kù)有很大的區(qū)別,也是 MongoDB 非常突出的特點(diǎn)。文檔是 MongoDB 的核心概念,是數(shù)據(jù)的基本單元,非常類似于關(guān)系型數(shù)據(jù)庫(kù)中的行。在 MongoDB 中,文檔表示為鍵值對(duì)的一個(gè)有序集。MongoDB 使用 JavaScript shell,文檔的表示一般使用 JavaScript 里面的對(duì)象的樣式來(lái)標(biāo)記,代碼如下:

{"title":"hello!"}
{"title":"hello!","recommend":5}
{"title":"hello!","recommend":5,"author":{"firstname":"張三","lastname":"李四"}}

創(chuàng)建文檔的時(shí)候需要注意:

  1. 文檔中的鍵值對(duì)是有序的。
  2. 文檔中的值不僅可以是在雙引號(hào)里面的字符串,還可以是其他幾種數(shù)據(jù)類型(甚至可以是整個(gè)嵌入的文檔)。
  3. MongoDB 區(qū)分類型和大小寫(xiě)。
  4. MongoDB 的文檔不能有重復(fù)的鍵。
  5. 文檔的鍵是字符串。除了少數(shù)例外情況,鍵可以使用任意 UTF-8 字符。

4.4.5 數(shù)據(jù)類型

在 MongoDB 中有幾種重要的數(shù)據(jù)類型,分別如下:

1、ObjectId: ObjectId 文檔自動(dòng)生成的 _id,類似于唯一主鍵,可以很快地生成和排序,它包含24B。例如:

{"_id" : ObjectId("5d69cf296693871a67f19983")}
含義分別如下:
0~8B(5d69cf29)表示時(shí)間戳,即這條數(shù)據(jù)產(chǎn)生的時(shí)間。
9~14B(669387)表示機(jī)器標(biāo)識(shí)符,即存儲(chǔ)這條數(shù)據(jù)時(shí)的機(jī)器編碼。
15~18B(1a67)表示進(jìn)程id。
19~24B(f19983)表示計(jì)數(shù)器。

MongoDB 中存儲(chǔ)的文檔必須有一個(gè) _id 鍵。這個(gè)鍵的值可以是任何類型的,默認(rèn)是 ObjectId 對(duì)象。

2、String: UTF-8 字符串都可表示為字符串類型的數(shù)據(jù)。
3、Boolean: 布爾值只有兩個(gè)值 true 和 false(注意 true 和 false 首字母小寫(xiě))。
4、Integer: 整數(shù),一般有 32 位和 64 位。

32位整數(shù):shell中這個(gè)類型不可用,JavaScript僅支持64位浮點(diǎn)數(shù),所以32位整數(shù)會(huì)被自動(dòng)轉(zhuǎn)換。
64位整數(shù):shell中這個(gè)類型不可用,shell會(huì)使用一個(gè)特殊的內(nèi)嵌文檔來(lái)顯示64位整數(shù)。

5、Double: 浮點(diǎn)數(shù),MongoDB 中沒(méi)有 Float 類型,所有小數(shù)都是 Double 類型。
6、Arrays: 數(shù)組,值的集合或者列表可以表示成數(shù)組,數(shù)組中的元素可以是不同類型的數(shù)據(jù),例如:

 {"x" : ["a", "b", "c", 20]}

7、Null: 空數(shù)據(jù)類型,表示不存在的字段。例如:

 {"x" : null}

8、Date: 日期類型存儲(chǔ)的是從標(biāo)準(zhǔn)紀(jì)元開(kāi)始的毫秒數(shù),不存儲(chǔ)時(shí)區(qū),例如:

{"x" : new Date()}

JavaScript 中 Date 對(duì)象用作 MongoDB 的日期類型,創(chuàng)建日期對(duì)象要使用 new Date() 而不是 Date(),返回的是對(duì)日期的字符串表示,而不是真正的 Date 對(duì)象。

4.4.6 索引

索引通常能夠極大地提高查詢的效率,如果沒(méi)有索引,MongoDB 在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢條件的記錄。這種掃描全集合的查詢效率是非常低的,特別在處理大量的數(shù)據(jù)時(shí),查詢要花費(fèi)幾十秒甚至幾分鐘,這對(duì)網(wǎng)站的性能是非常致命的。索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲(chǔ)在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中,索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)。createIndex() 方法:MongoDB 使用 createIndex() 方法來(lái)創(chuàng)建索引。createIndex() 方法基本語(yǔ)法格式如下所示:

>db.collection.createIndex(keys, options)

語(yǔ)法中 key 值為要?jiǎng)?chuàng)建的索引字段,1為指定按升序創(chuàng)建索引,-1為指定按降序創(chuàng)建索引。

至此今天的學(xué)習(xí)就到此結(jié)束了,筆者在這里聲明,筆者寫(xiě)文章只是為了學(xué)習(xí)交流,以及讓更多學(xué)習(xí)數(shù)據(jù)庫(kù)的讀者少走一些彎路,節(jié)省時(shí)間,并不用做其他用途,如有侵權(quán),聯(lián)系博主刪除即可。感謝您閱讀本篇博文,希望本文能成為您編程路上的領(lǐng)航者。祝您閱讀愉快!


在這里插入圖片描述

????好書(shū)不厭讀百回,熟讀課思子自知。而我想要成為全場(chǎng)最靚的仔,就必須堅(jiān)持通過(guò)學(xué)習(xí)來(lái)獲取更多知識(shí),用知識(shí)改變命運(yùn),用博客見(jiàn)證成長(zhǎng),用行動(dòng)證明我在努力。
????如果我的博客對(duì)你有幫助、如果你喜歡我的博客內(nèi)容,請(qǐng) 點(diǎn)贊、評(píng)論、收藏 一鍵三連哦!聽(tīng)說(shuō)點(diǎn)贊的人運(yùn)氣不會(huì)太差,每一天都會(huì)元?dú)鉂M滿呦!如果實(shí)在要白嫖的話,那祝你開(kāi)心每一天,歡迎常來(lái)我博客看看。
?編碼不易,大家的支持就是我堅(jiān)持下去的動(dòng)力。點(diǎn)贊后不要忘了 關(guān)注 我哦!

http://www.risenshineclean.com/news/3168.html

相關(guān)文章:

  • 實(shí)驗(yàn)室網(wǎng)站建設(shè)的調(diào)查報(bào)告今日重大新聞?lì)^條財(cái)經(jīng)
  • 國(guó)外有哪些做服裝的網(wǎng)站百度指數(shù)對(duì)比
  • dede怎么設(shè)置wap網(wǎng)站云客網(wǎng)平臺(tái)
  • wordpress 手機(jī)注冊(cè)網(wǎng)站優(yōu)化推廣培訓(xùn)
  • 網(wǎng)站怎么做展現(xiàn)量網(wǎng)站運(yùn)營(yíng)推廣方案
  • 男女直接做的視頻網(wǎng)站北京關(guān)鍵詞優(yōu)化平臺(tái)
  • 湖南網(wǎng)站建設(shè) 安全還踏實(shí)磐石網(wǎng)絡(luò)百度平臺(tái)聯(lián)系方式
  • 湖南網(wǎng)站開(kāi)發(fā) 嵐鴻外貿(mào)營(yíng)銷網(wǎng)站
  • 照片做3d網(wǎng)站網(wǎng)絡(luò)平臺(tái)銷售
  • 一級(jí)a做爰片免費(fèi)網(wǎng)站孕交視頻開(kāi)封網(wǎng)站seo
  • 個(gè)人網(wǎng)站備案取消百度app客服電話
  • 聊城網(wǎng)站建設(shè)價(jià)位國(guó)外域名注冊(cè)網(wǎng)站
  • 廣西柳州網(wǎng)站建設(shè)百度手機(jī)app
  • 做液氮冰淇淋店網(wǎng)站建設(shè)網(wǎng)站的網(wǎng)絡(luò)公司
  • 惠城東莞網(wǎng)站建設(shè)最有效的100個(gè)營(yíng)銷方法
  • 怎么做網(wǎng)頁(yè)平臺(tái)太原網(wǎng)站seo
  • 東莞企業(yè)網(wǎng)站找誰(shuí)搜索引擎優(yōu)化理解
  • 企業(yè)網(wǎng)站微信公眾號(hào)的建設(shè)事跡東莞seo整站優(yōu)化
  • 中國(guó)行業(yè)網(wǎng)站聯(lián)盟重慶網(wǎng)絡(luò)推廣外包
  • 紅安縣建設(shè)局網(wǎng)站西地那非片的功效與作用
  • 選服務(wù)好的網(wǎng)站建設(shè)公司廣州私人做網(wǎng)站
  • 武漢做網(wǎng)站哪家公司好優(yōu)化大師如何刪掉多余的學(xué)生
  • 陽(yáng)江兼職招聘網(wǎng)最新招聘站外seo是什么
  • 企業(yè)網(wǎng)站模板建站seo工作內(nèi)容
  • 個(gè)人網(wǎng)站收款接口windows優(yōu)化大師是系統(tǒng)軟件嗎
  • 粉色做網(wǎng)站背景圖片win7怎么優(yōu)化最流暢
  • 網(wǎng)站建設(shè)技術(shù)服務(wù)公司sem分析是什么意思
  • 服務(wù)器做視頻網(wǎng)站松原今日頭條新聞
  • 用什么做視頻網(wǎng)站蘇州關(guān)鍵詞優(yōu)化排名推廣
  • 盛世陽(yáng)光-網(wǎng)站建設(shè)吸引人氣的營(yíng)銷方案