2024/08/17

MonetDB

MonetDB is an open-source column-oriented relational database management system (RDBMS) originally developed at the Centrum Wiskunde & Informatica (CWI) in the Netherlands. It is designed to provide high performance on complex queries against large databases, such as combining tables with hundreds of columns and millions of rows.

MonetDB architecture is represented in three layers, each with its own set of optimizers. The front end is the top layer, providing query interface for SQL. Queries are parsed into domain-specific representations, like relational algebra for SQL, and optimized. The generated logical execution plans are then translated into MonetDB Assembly Language (MAL) instructions, which are passed to the next layer. The middle or back-end layer provides a number of cost-based optimizers for the MAL. The bottom layer is the database kernel, which provides access to the data stored in Binary Association Tables (BATs). Each BAT is a table consisting of an Object-identifier and value columns, representing a single column in the database.

MonetDB internal data representation also relies on the memory addressing ranges of contemporary CPUs using demand paging of memory mapped files, and thus departing from traditional DBMS designs involving complex management of large data stores in limited memory.


使用 RPM 安裝以後,使用下列的方式開啟資料庫服務:

sudo systemctl start monetdbd.service

使用下列的方式查詢目前的狀態:

sudo systemctl status monetdbd.service

使用下列的方式停止服務:

sudo systemctl stop monetdbd.service

下面建立一個 demo 資料庫。

sudo monetdb create demo

還需要 release 才能夠使用:

sudo monetdb release demo

然後就可以使用 mclient 連線進行測試:

mclient -u monetdb -d demo

一般而言可以將 user/password 記錄在 .monetdb 中,這樣就不需要輸入帳號密碼,只需要提供資料庫名稱。 下面是內容設定的例子:

user=monetdb
password=monetdb

如果想要刪除資料庫,可以使用 stop 與 destroy:

sudo monetdb stop demo
sudo monetdb destroy demo

使用下列的指令建立一個使用者 danilo:

CREATE USER "danilo" WITH PASSWORD 'danilo' NAME 'Danilo' SCHEMA "sys";
CREATE SCHEMA "danilo" AUTHORIZATION "danilo";
ALTER USER "danilo" SET SCHEMA "danilo";

使用 mclient 連線驗證:

mclient -u danilo demo

MonetDB/e Embedded

MonetDB/e is the embedded version of MonetDB, embed the power of an analytical SQL database engine in your Python or C/C++ applications.

相關連結

2024/08/15

NoSQL (Not only SQL)

一個資料庫在最基礎的層次上需要完成兩件事情:當你把資料交給資料庫時,它應當把資料儲存起來;而後當你向資料庫要資料時,它應當把資料返回給你。

如果要了解 SQL 為什麼重要,我們需要從 NoSQL (Not only SQL) 開始出發。NoSQL 其實是資料庫使用觀念的復古運動、正確觀念的復興運動。 也就是關聯式資料庫並不是唯一且最適的解法,要根據資料的使用特性,選擇適當的儲存機制,所謂的 NoSQL (Not only SQL)。

規模可伸縮性優先考慮是那些必須具備無限可伸縮性的應用,能夠不受限制的擴展比更豐富的功能更加重要。 這些應用包括很多需要高可伸縮性的網站,如 Facebook。 有些網站使用了關聯型資料庫系統,而有些並未採用之。 這些服務的共通性在於對規模可伸縮性的需求比功能更重要,他們無法將應用使用一個單一 RDBMS 解決。 因此,要怎麼處理資料仍然是要不要採用 NoSQL 資料庫的重點(傳統 row-based 的 RDBMS 也有叢集的解決方案, 只是擴張節點相對於某些類型 NoSQL 資料庫而言,比較沒有彈性,不過目前分散式的 RDBMS 解決方案已經出現並且已經有應用實例), 而不是因為某個 NoSQL "awesome" 所以採用,使用了錯誤的資料模型在專案上將容易導致專案的失敗。

比較流行的 NoSQL 資料庫有下列的形式:

  • Key/Value store: map (key, value),是一種簡單的資料模型,適用的情況通常是作為 cache 使用。
  • Document-store: The central concept of a document store is the notion of a "document". 目前比較常見的是 JSON 和 XML 文件。文件模式的資料庫在處理關聯性時反而比較弱, 因為文件應該是 self-contained 的,所以資料之間會有關聯性的情況下儘量不要考慮這個資料模型。
  • Wide column store: For software developers, it can sometimes be helpful to think of them as a key-value collection where each value in the collection is either a simple data type or another key-value collection. For example: map (key, map (key, value)),與傳統的 RDBMS 資料庫(例如 PostgreSQL, CUBRID, MariaDB, MySQL)相比, 適用的範圍是需要良好的可伸縮性與大量資料範圍查詢時的情況。 另外,就是可能會有一個解決方案是使用 SQL 或者是類似的查詢語言來處理與管理 Wide column store 的資料。
  • Graph: This kind of database is designed for data whose relations are well represented as a graph (elements interconnected with an undetermined number of relations between them), 適用於多對多關係(例如社群網站)的情況。與其它模式相比,資料模式十分複雜。 但是注意,多對多關係也不一定只能使用 Graph 資料庫,例如臉書一開始是使用 MySQL 實作。
  • Search Engines:搜尋引擎並不是資料庫,但是可以用來檢索資料並且作為資料庫的輔助工具。 有些搜尋引擎結合文件資料庫或者是 RDBMS 而成為一個完整的資料庫產品。

關聯式資料庫一般而言可以分為二個類型, OLTP (Online transaction processing) 與 OLAP (Online analytical processing), 當然也有試著融合二者的 HTAP 資料庫,不過一般而言還是按照 OLTP 與 OLAP 來分類。 NoSQL 資料庫的使用情況也可以按照這二個類型來分類。

SQL 是為了存取或操作關聯式資料庫所設計的語言。SQL 的出現,解決了以往程式與資料庫相依性過高的問題, 透過 SQL 存取資料庫使得後端資料庫較容易更換(雖然有語法上的相容問題,還是比 NoSQL 資料庫之間的切換簡單), 因此達成資料庫的獨立性,而前端的介面也可獨立使用不同的開發工具。如此將資料層分離出來,儲存到資料庫伺服器, 對於維護與安全都更有保障。

對我來說,過度強調 RDBMS 缺乏良好的可伸縮性是一種 FUD (Fear, Uncertainty, Doubt), 如果一個 RDBMS 其儲存層是建立在分布式系統之上,而且使用 Raft 算法來解決一致性的問題, 那就你就有一個具有良好的可伸縮性的 RDBMS,例如 TiDB。 另外,有一些 SQL solution 使用了 NoSQL 資料庫作為存儲層(雖然有可能不支援或者是僅是有限度的支援 transaction, 不過也不是所有的關聯式資料庫都支援 transaction,一些 OLAP 類型的可能就不支援), 例如 Apache Phoenix 就是建立在 Apache HBase 之上,在這個情況下使用者一樣可以使用 SQL 語言存取 NoSQL 資料庫。

並不是 NoSQL 資料庫就表示有良好的可伸縮性,至少以我所認知的各種資料庫來說, 一般而言為 Wide column store 具有良好的可伸縮性(也就是 Apache HBase 與 Apache Cassandra,以及其它類似技術的資料庫), 其餘形式的資料庫大多數也都是使用傳統 RDBMS 橫向拓展的方法,在可伸縮性這點而言並未具有優勢明顯。 因此對比 RDBMS 來說,NoSQL 資料庫通常是為了解決一些特定的問題而使用,缺點就是程式與資料庫相依性過高(有可能造成被廠商綁定的問題), 缺少一部份 RDBMS 提供的功能而需要自己再造一次輪子,以及安全性上的考量。大部份的情況下還是應該先考慮 RDBMS 是否可以適用。

最後一點,就是用 SQL 代稱某種類型的資料庫是不夠好的說法,畢竟 SQL 是一個查詢語言,因此不應該作為某種資料庫的代稱。 就我個人來說,SQL 這個查詢語言是個很好用的工具,而目前的發展也證明他是個歷久彌新的查詢語言。

CUBRID database

CUBRID 是一個開放原始碼的關係資料庫管理系統, 為高效執行線上交易處理進行了高度優化,特別是需要處理大數據量和高並發請求的複雜商務服務, 支援 Windows 與 Linux 平台。 CUBRID 這個名稱,實際上是兩個單詞的組合:"Cube"(立方體)和"Bride"(橋梁)。 對 CUBRID 而言,"Bride"代表"data bridge"(數據橋), 而"Cube"代表儲存數據的盒子,寓意為放在其中的數據提供安全。

CUBRID 架構特別的地方是加入了 Broker 的設計,Broker 是一個 middleware, 用來處理應用程式與資料庫 server 之間的連線。 會這麼設計的原因是因為 CUBRID 原本是南韓 Naver(Naver 為南韓搜尋引擎龍頭)的內部計畫, 用來取代內部的 Oracle 資料庫以節省資料庫方面日益增加的授權費用, 為了能夠順利過渡,所以加入了 Broker 的設計,而後才公開資料庫的原始碼並成為一個開放原始碼計畫 (Naver 也只有開放 Broker 關於 CRBRID 方面的原始碼)。


CUBRID 使用 NCurses 5 library,如果是已經升到 6 的系統可以安裝相容 ABI 的函式庫,openSUSE Tumbleweed 安裝的指令如下:

sudo zypper in libncurses5

在官網上下載安裝程式以後安裝(我目前使用 11.3),我是安裝在自己的家目錄下。然後使用下列的指令設定環境變數。
如果是使用 sh, bash 或者是 zsh:

source .cubrid.sh

如果是使用 csh 或者是 tcsh:

source .cubrid.csh

如果要啟動 CUBRID 的服務,使用下列的指令:

cubrid service start

如果要停止 CUBRID 的服務,使用下列的指令:

cubrid service stop

在安裝目錄下的 databases 建立一個目錄 testdb,使用下列的指令建立新的資料庫 testdb:

cubrid createdb testdb en_US.utf8

如果需要刪除資料庫,使用下列的指令:

cubrid deletedb testdb

如果要在 database server 開始的時候指定要使用的資料庫,可以這樣執行指令:

cubrid server start testdb

或者是修改 conf 目錄下的 cubrid.conf,加入下面的設定:

# The list of database servers in all by 'cubrid service start' command.
# This property is effective only when the above 'service' property contains 'server' keyword.
server=testdb

(如果使用設定 cubrid.conf 的方式,就不用使用 cubrid server start,而是在 cubrid service start 時就會跟著啟動 server。)


CUBRID 提供了 csql 工具可以用來下達命令。使用 CSQL 連到 testdb 資料庫(使用 dba 帳號):

csql -u dba testdb

管理帳號 dba 預設的密碼為空白,如果想要設置一個密碼,下面是一個範例:

alter user dba password 'dba';

下面是新增一個使用者與設定其密碼的例子:

CREATE USER danilo;
ALTER USER danilo PASSWORD 'danilo';

相關連結