1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Cozo事務(wù)型關(guān)系型數(shù)據(jù)庫

        聯(lián)合創(chuàng)作 · 2023-10-01 02:33

        Cozo 是事務(wù)型關(guān)系型數(shù)據(jù)庫,使用 Datalog 作為查詢語言的高性能·關(guān)系型·可嵌入式·圖數(shù)據(jù)庫。

        • 一個(gè) 可嵌入 的數(shù)據(jù)庫;
        • 一個(gè)使用 Datalog 作為查詢語句的數(shù)據(jù)庫;
        • 一個(gè)專注于 圖數(shù)據(jù)、圖算法 的數(shù)據(jù)庫;
        • 一個(gè)可進(jìn)行 歷史穿梭 查詢的數(shù)據(jù)庫;
        • 一個(gè)支持 高性能、高并發(fā) 的數(shù)據(jù)庫。

        “可嵌入”是什么意思?

        如果某個(gè)數(shù)據(jù)庫能在不聯(lián)網(wǎng)的手機(jī)上使用,那它大概就是嵌入式的。舉例來說,SQLite 是嵌入式的,而 MySQL、Postgres、Oracle 等不是(它們是客戶端—服務(wù)器(CS)架構(gòu)的數(shù)據(jù)庫)。

        如果數(shù)據(jù)庫與你的主程序在同一進(jìn)程中運(yùn)行,那么它就是 嵌入式 數(shù)據(jù)庫。與此相對,在使用 客戶端—服務(wù)器 架構(gòu)的數(shù)據(jù)庫時(shí),主程序需要通過特定的接口(通常是網(wǎng)絡(luò)接口)訪問數(shù)據(jù)庫,而數(shù)據(jù)庫也可能運(yùn)行在另一臺機(jī)器或獨(dú)立的集群上。嵌入式數(shù)據(jù)庫使用簡單,資源占用少,并可以在更廣泛的環(huán)境中使用。

        Cozo 同時(shí)也支持以客戶端—服務(wù)器模式運(yùn)行。因此,Cozo 是一個(gè) 可嵌入 而不是僅僅是 嵌入式 的數(shù)據(jù)庫。在客戶端—服務(wù)器模式下,Cozo 可以更充分地發(fā)揮服務(wù)器的性能。

        “圖數(shù)據(jù)”有什么用?

        從本質(zhì)上來說,數(shù)據(jù)一定是相互關(guān)聯(lián)、自關(guān)聯(lián)的,而這種關(guān)聯(lián)的數(shù)學(xué)表達(dá)便是 (也叫 網(wǎng)絡(luò))。只有考慮這些關(guān)聯(lián),才能更深入地洞察數(shù)據(jù)背后的邏輯。

        大多數(shù)現(xiàn)有的 圖數(shù)據(jù)庫 強(qiáng)制要求按照屬性圖(property graph)的范式存儲數(shù)據(jù)。與此相對,Cozo 使用傳統(tǒng)的關(guān)系數(shù)據(jù)模型。關(guān)系數(shù)據(jù)模型有存儲邏輯簡單、功能強(qiáng)勁等優(yōu)點(diǎn),并且處理圖數(shù)據(jù)也毫無問題。更重要的是,數(shù)據(jù)的洞察常常需要挖掘隱含的關(guān)聯(lián),而關(guān)系數(shù)據(jù)模型作為關(guān)系 代數(shù)(relational algebra)可以很好地處理此類問題。比較而言,因?yàn)槠洳粯?gòu)成一個(gè)代數(shù),屬性圖模型僅僅能夠?qū)@性的圖關(guān)系作為圖數(shù)據(jù)處理,可組合性很弱。

        “Datalog”好在哪兒?

        Datalog 1977 年便出現(xiàn)了,它可表達(dá)所有的 關(guān)系型查詢,而它與 SQL 比起來的優(yōu)勢在于其對 遞歸 的表達(dá)。由于執(zhí)行邏輯不同,Datalog 對于遞歸的運(yùn)行,通常比相應(yīng)的 SQL 查詢更快。Datalog 的可組合性、模塊性都很優(yōu)秀,使用它,你可以逐層、清晰地表達(dá)所需的查詢。

        遞歸對于圖查詢尤其重要。Cozo 使用的 Datalog 方言 叫做 CozoScript,其允許在一定條件下混合使用聚合查詢與遞歸,從而進(jìn)一步增強(qiáng)了 Datalog 的表達(dá)能力。同時(shí),Cozo內(nèi)置了圖分析中常用的一些算法(如 PageRank 等),調(diào)用簡單。

        對 Datalog 有進(jìn)一步了解以后,你會(huì)發(fā)現(xiàn) Datalog 的 規(guī)則 類似于編程語言中的函數(shù)。規(guī)則的一大特點(diǎn)是其可組合性:將一個(gè)查詢分解為多個(gè)漸進(jìn)的規(guī)則可使查詢更清晰、易維護(hù),且不會(huì)有效率上的損失。與此相對的,復(fù)雜的 SQL 查詢語句通常表達(dá)為多層嵌套的“select-from-where”,可讀性、可維護(hù)性都不高。

        歷史穿梭?

        在數(shù)據(jù)庫中,“歷史穿梭”的意思是記錄數(shù)據(jù)的一切變化,以允許針對某一時(shí)刻的數(shù)據(jù)進(jìn)行執(zhí)行查詢,用來窺探歷史。

        在某種意義上,這使數(shù)據(jù)庫成為 不可變 數(shù)據(jù)庫,因?yàn)闆]有數(shù)據(jù)會(huì)被真正刪除。

        每一項(xiàng)額外的功能都有其代價(jià)。如果不使用某個(gè)功能,理想的狀態(tài)是不必為這個(gè)功能的代價(jià)埋單。在 Cozo 中,不是所有數(shù)據(jù)表都自動(dòng)支持歷史穿梭,這就把是否需要此功能、是否愿意支付代價(jià)的選擇權(quán)交到了用戶手里。

        這個(gè)關(guān)于歷史穿梭的小故事可能啟發(fā)出一些歷史穿梭的應(yīng)用場景。

        “高性能、高并發(fā)”,有多高?

        我們在一臺 2020 年的 Mac Mini 上,使用 RocksDB 持久性存儲引擎(Cozo 支持多種存儲引擎)做了性能測試:

        • 對一個(gè)有 160 萬行的表進(jìn)行查詢:讀、寫、改的混合事務(wù)性查詢可達(dá)到每秒 10 萬次,而只讀查詢可達(dá)到每秒 25 萬次。在此過程中,數(shù)據(jù)庫使用的內(nèi)存峰值僅為50MB。
        • 備份數(shù)據(jù)的速度為每秒約 100 萬行,恢復(fù)速度為每秒約 40 萬行。備份、恢復(fù)的速度不隨表單數(shù)據(jù)增長而變慢。
        • 分析查詢:掃描一個(gè)有 160 萬行的表大約需要 1 秒(根據(jù)具體查詢語句大約有上下 2 倍以內(nèi)的差異)。查詢所需時(shí)間與查詢所涉及的行數(shù)大致成比例,而內(nèi)存使用主要決定于返回集合的大小。
        • 對于一個(gè)有 160 萬個(gè)頂點(diǎn),3100 萬條邊的圖數(shù)據(jù)表,“兩跳”圖查詢(如查詢某人的朋友的朋友都有誰)可在 1 毫秒內(nèi)完成。
        • Pagerank 算法速度:1 萬個(gè)頂點(diǎn),12 萬條邊:50 毫秒以內(nèi);10 個(gè)萬頂點(diǎn),170 萬條邊:1 秒以內(nèi);160 萬個(gè)頂點(diǎn),3100 萬條邊:30秒以內(nèi)。

        更多的細(xì)節(jié)參見此文。

        學(xué)習(xí) Cozo

        你得先安裝一個(gè)數(shù)據(jù)庫才能開始學(xué),對吧?不一定:Cozo 是“嵌入式”的,所以我們直接把它通過 WASM 嵌入到瀏覽器里了!打開這個(gè)頁面,然后:

        當(dāng)然也可以一步到位:先翻到后面了解如何在熟悉的環(huán)境里安裝原生 Cozo 數(shù)據(jù)庫,再開始學(xué)習(xí)。

        一些示例

        通過以下示例,可在正式開始學(xué)習(xí)之前對 Cozo 的查詢先有個(gè)感性認(rèn)識。

        假設(shè)有個(gè)表,名為 *route,含有兩列,名為 frto,其中數(shù)據(jù)為機(jī)場代碼(如 FRA 是法蘭克福機(jī)場的代碼),且每行數(shù)據(jù)表示一個(gè)飛行航線。

        FRA 可以不轉(zhuǎn)機(jī)到達(dá)多少個(gè)機(jī)場:

        ?[count_unique(to)] := *route{fr: 'FRA', to}
        
        count_unique(to)
        310

        FRA 出發(fā),轉(zhuǎn)機(jī)一次,可以到達(dá)多少個(gè)機(jī)場:

        ?[count_unique(to)] := *route{fr: 'FRA', to: 'stop},
                               *route{fr: stop, to}
        
        count_unique(to)
        2222

        FRA 出發(fā),轉(zhuǎn)機(jī)任意次,可以到達(dá)多少個(gè)機(jī)場:

        reachable[to] := *route{fr: 'FRA', to}
        reachable[to] := reachable[stop], *route{fr: stop, to}
        ?[count_unique(to)] := reachable[to]
        
        count_unique(to)
        3462

        FRA 出發(fā),按所需的最少轉(zhuǎn)機(jī)次數(shù)排序,到達(dá)哪兩個(gè)機(jī)場需要最多的轉(zhuǎn)機(jī)次數(shù):

        shortest_paths[to, shortest(path)] := *route{fr: 'FRA', to},
                                              path = ['FRA', to]
        shortest_paths[to, shortest(path)] := shortest_paths[stop, prev_path],
                                              *route{fr: stop, to},
                                              path = append(prev_path, to)
        ?[to, path, p_len] := shortest_paths[to, path], p_len = length(path)
        
        :order -p_len
        :limit 2
        
        to path p_len
        YPO ["FRA","YYZ","YTS","YMO","YFA","ZKE","YAT","YPO"] 8
        BVI ["FRA","AUH","BNE","ISA","BQL","BEU","BVI"] 7

        FRAYPO 這兩個(gè)機(jī)場之間最短的路徑以及其實(shí)際飛行里程是多少:

        start[] <- [['FRA']]
        end[] <- [['YPO]]
        ?[src, dst, distance, path] <~ ShortestPathDijkstra(*route[], start[], end[])
        
        src dst distance path
        FRA YPO 4544.0 ["FRA","YUL","YVO","YKQ","YMO","YFA","ZKE","YAT","YPO"]

        當(dāng)查詢語句有錯(cuò)時(shí),Cozo 會(huì)提供明確有用的錯(cuò)誤信息:

        ?[x, Y] := x = 1, y = x + 1
        
        eval::unbound_symb_in_head
        
          × Symbol 'Y' in rule head is unbound
           ╭────
         1 │ ?[x, Y] := x = 1, y = x + 1
           · 
           ╰────
          help: Note that symbols occurring only in negated positions are not considered bound
        

        更多信息請參見軟件網(wǎng)址及文檔。

        瀏覽 10
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        編輯 分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        編輯 分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲第一中文字幕 | 黄色片视频日韩 | 国产又大又黄又粗的视频 | 白浆在线 | 国产婷婷一区二区三区久久 | 曹逼免费看 | 国产香蕉97碰碰碰视频在线观看 | 女十八免费毛片视频 | 在线黄色毛片 | 秋霞无码|