<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ## 數據模型 現在最著名的數據模型可能是SQL。它基于Edgar Codd在1970年提出的關系模型:數據被組織成**關系**(SQL中稱作**表**),其中每個關系是**元組**(SQL中稱作**行**)的無序集合。 ### NoSQL的誕生 采用NoSQL數據庫的背后有幾個驅動因素,其中包括: * 需要比關系數據庫更好的可擴展性,包括非常大的數據集或非常高的寫入吞吐量 * 相比商業數據庫產品,免費和開源軟件更受偏愛。 * 關系模型不能很好地支持一些特殊的查詢操作 * 受挫于關系模型的限制性,渴望一種更具多動態性與表現力的數據模型 ### 對象關系不匹配 目前大多數應用程序開發都使用面向對象的編程語言來開發,這導致了對SQL數據模型的普遍批評:如果數據存儲在關系表中,那么需要一個笨拙的轉換層,處于應用程序代碼中的對象和表,行,列的數據庫模型之間。模型之間的不連貫有時被稱為**阻抗不匹配(impedance mismatch)** ### 多對一和多對多的關系 存儲ID還是文本字符串,這是個**副本(duplication)**問題。當使用ID時,對人類有意義的信息(比如單詞:Philanthropy)只存儲在一處,所有引用它的地方使用ID(ID只在數據庫中有意義)。當直接存儲文本時,對人類有意義的信息會復制在每處使用記錄中 使用ID的好處是,ID對人類沒有任何意義,因而永遠不需要改變:ID可以保持不變,即使它標識的信息發生變化。任何對人類有意義的東西都可能需要在將來某個時候改變 ### 文檔模型中的架構靈活性 - 文檔數據庫有時稱為**無模式(schemaless)**,又稱為讀模式(schema-on-read)(數據的結構是隱含的,只有在數據被讀取時才被解釋) - 傳統的關系數據庫是**寫時模式(schema-on-write)** 讀時模式類似于編程語言中的動態(運行時)類型檢查,而寫時模式類似于靜態(編譯時)類型檢查 例子: 把姓名分為first name 和 last name 在文檔數據庫種只需要改為如下,動態的做一個判斷 ``` if (user && user.name && !user.first_name) { // Documents written before Dec 8, 2013 don't have first_name user.first_name = user.name.split(" ")[0]; } ``` 在“靜態類型”數據庫模式中,通常會執行以下 遷移(migration) 操作 ``` ALTER TABLE users ADD COLUMN first_name text; UPDATE users SET first_name = split_part(name, ' ', 1); -- PostgreSQL UPDATE users SET first_name = substring_index(name, ' ', 1); -- MySQL ``` ### 使用場景 當由于某種原因(例如,數據是異構的)集合中的項目并不都具有相同的結構時,讀時模式更具優勢。例如,如果: * 存在許多不同類型的對象,將每種類型的對象放在自己的表中是不現實的。 * 數據的結構由外部系統決定。你無法控制外部系統且它隨時可能變化 ## 數據查詢語言 關系模型包含了一種查詢數據的新方法:SQL是一種**聲明式**查詢語言,而IMS和CODASYL使用**命令式**代碼來查詢數據庫 命令式 ``` function getSharks() { var sharks = []; for (var i = 0; i < animals.length; i++) { if (animals[i].family === "Sharks") { sharks.push(animals[i]); } } return sharks; } ``` 聲明式 ``` SELECT * FROM animals WHERE family ='Sharks'; ``` 聲明式查詢語言它通常比命令式API更加簡潔和容易。但更重要的是,它還隱藏了數據庫引擎的實現細節,這使得數據庫系統可以在無需對查詢做任何更改的情況下進行性能提升 ### MapReduce查詢 - MapReduce是一個由Google推廣的編程模型,用于在多臺機器上批量處理大規模的數據【33】。一些NoSQL數據存儲(包括MongoDB和CouchDB)支持有限形式的MapReduce,作為在多個文檔中執行只讀查詢的機制 - MapReduce既不是一個聲明式的查詢語言,也不是一個完全命令式的查詢API,而是處于兩者之間 ### 圖數據模型 - 多對多關系是不同數據模型之間具有區別性的重要特征。如果你的應用程序大多數的關系是一對多關系(樹狀結構化數據),或者大多數記錄之間不存在關系,那么使用文檔模型是合適的 一個圖由兩種對象組成:**頂點(vertices)**(也稱為**節點(nodes)**或**實體(entities)**),和**邊(edges)**( 也稱為**關系(relationships)**或**弧 (arcs)**)。多種數據可以被建模為一個圖形 有幾種不同但相關的方法用來構建和查詢圖表中的數據 1. 屬性圖模型 2. 三元組存儲(triple-store)模型 #### 屬性圖模型 在屬性圖模型中,每個**頂點(vertex)**包括: * 唯一的標識符 * 一組**出邊(outgoing edges)** * 一組**入邊(ingoing edges)** * 一組屬性(鍵值對) 每條**邊(edge)**包括: * 唯一標識符 * **邊的起點/尾部頂點(tail vertex)** * **邊的終點/頭部頂點(head vertex)** * 描述兩個頂點之間關系類型的標簽 * 一組屬性(鍵值對) ![](https://img.kancloud.cn/7b/c5/7bc56a89a9f588f3a9c2f40449098da8_1480x896.png) 1. 任何頂點都可以有一條邊連接到任何其他頂點。沒有模式限制哪種事物可不可以關聯。 2. 給定任何頂點,可以高效地找到它的入邊和出邊,從而遍歷圖,即沿著一系列頂點的路徑前后移動。 3. 通過對不同類型的關系使用不同的標簽,可以在一個圖中存儲幾種不同的信息,同時仍然保持一個清晰的數據模型。 圖表在可演化性是富有優勢的:當向應用程序添加功能時,可以輕松擴展圖以適應應用程序數據結構的變化 ##### Cypher查詢語言 Cypher是屬性圖的聲明式查詢語言,為Neo4j圖形數據庫而發明 ``` CREATE (NAmerica:Location {name:'North America', type:'continent'}), (USA:Location {name:'United States', type:'country' }), (Idaho:Location {name:'Idaho', type:'state' }), (Lucy:Person {name:'Lucy' }), (Idaho) -[:WITHIN]-> (USA) -[:WITHIN]-> (NAmerica), (Lucy) -[:BORN_IN]-> (Idaho) ``` 美國移民到歐洲的人的Cypher查詢 ``` MATCH (person) -[:BORN_IN]-> () -[:WITHIN*0..]-> (us:Location {name:'United States'}), (person) -[:LIVES_IN]-> () -[:WITHIN*0..]-> (eu:Location {name:'Europe'}) RETURN person.name ``` #### 三元組存儲triple-store)模型 三元組存儲模式大體上與屬性圖模型相同,用不同的詞來描述相同的想法 在三元組存儲中,所有信息都以非常簡單的三部分表示形式存儲(**主語**,**謂語**,**賓語**),例如,三元組 (吉姆, 喜歡 ,香蕉) 中,吉姆 是主語,喜歡 是謂語(動詞),香蕉 是對象
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看