MariaDB 特性介紹-動態虛擬列
MariaDB為NoSQL的擴展提供的另外一個特性 就是:動態列。對表的每一行都可以有一個“虛擬列”,該列可以用于保存一個對象的不同屬性,每個屬性在各行之間可以完全不同,“虛擬列”的個數和內容完全有應用程序來控制和解釋。
NoSQL的另外一個好處就是,我存儲的東西是一個沒有結構的東西,而數據庫則要求是一個固定列名,確定長度的一個個列。為了滿足這個需求,MariaDB引入了動態列的概念。它允許你在每一行上有一個“虛擬列”。這個虛擬列被作為一個額外的字段存在在blob中,并且有一系列函數用于創建,更新,刪除,檢查,查詢這個列。 空說無憑,舉例為證。我們先創建一個表t1,用來存儲shirt,phone,computer商品的價格,其中dynstr就是用于做虛擬列的:
create table t1 (id int auto_increment primary key,
name varchar(40),
type enum ("shirt", "phone", "computer"),
price decimal(10,2),
dynstr mediumblob);
并插入一些數據:
insert into t1 (name, type, price, dynstr) values
("Funny shirt", "shirt", 10.0, COLUMN_CREATE(1, "blue", 10, "XL")),
("nokia", "phone", 649, COLUMN_CREATE(1, "black", 2, "touchscreen")),
("htc Desire hd", "phone", 579, COLUMN_CREATE(1, "black", 3, "Android")),
("BM/Lenovo Thinkpad X60s", "computer", 419, COLUMN_CREATE(1, "black", 3, "Linux"));
這里利用了COLUMN_CREATE()函數來創建動態列。插入的四條數據。針對各個不同的商品定義不同的屬性。比如1在各個商品中表示的是顏色;3表示的是操作系統;10表示的是大小。每行數據的屬性不完全相同,也不要求所有的屬性值都需要包含在動態列中。那么,動態列的有哪些屬性要怎么查看列:
select id, name, type, price, length(dynstr) as len, column_list(dynstr) as list from t1;
+----+-------------------------+----------+--------+------+------+
| id | name | type | price | len | list |
+----+-------------------------+----------+--------+------+------+
| 1 | Funny shirt | shirt | 10.00 | 17 | 1,10 |
| 2 | nokia | phone | 649.00 | 27 | 1,2 |
| 3 | htc Desire hd | phone | 579.00 | 23 | 1,3 |
| 4 | BM/Lenovo Thinkpad X60s | computer | 419.00 | 21 | 1,3 |
+----+-------------------------+----------+--------+------+------+
COLUMN_LIST()可以列出動態列到底有哪些屬性,這樣的話我們就可以根據屬性過濾:
SELECT name FROM t1 WHERE COLUMN_GET(dynstr, 1 as char(10)) = "black";
+-------------------------+
| name |
+-------------------------+
| nokia |
| htc Desire hd |
| BM/Lenovo Thinkpad X60s |
+-------------------------+
SELECT name, COLUMN_GET(dynstr, 1 as char(10)) FROM t1 WHERE COLUMN_EXISTS(dynstr, 1);
+-------------------------+--------+
| name | colour |
+-------------------------+--------+
| Funny shirt | blue |
| nokia | black |
| htc Desire hd | black |
| BM/Lenovo Thinkpad X60s | black |
+-------------------------+--------+
上面的第一條SQL查詢了顏色為black的所有產品哪些屬性,第二條SQL查詢了存在顏色屬性的所有行。對應的COLUMN_GET() 函數表示獲取對應屬性的屬性值。COLUMN_EXISTS()函數表示動態列中是否存儲了該屬性值。我們也注意到,現在動態列的所有屬性都是用數字來表示的。
前面都是對動態列創建和查詢的例子,我們再看看更新的例子。比如我們需要對類型為‘computer’的數據加4G內存:
UPDATE t1 set dynstr=COLUMN_ADD(dynstr, 15, "4G ram") where type="computer";
SELECT name, type, price, length(dynstr) as len, column_list(dynstr) as list from t1 where type="computer";
+-------------------------+----------+--------+------+--------+
| name | type | price | len | list |
+-------------------------+----------+--------+------+--------+
| BM/Lenovo Thinkpad X60s | computer | 419.00 | 29 | 1,3,15 |
+-------------------------+----------+--------+------+--------+
COLUMN_ADD()函數會給每個’computer’的行加上新的屬性,屬性值為‘4G ram’。不過,COLUMN_ADD()并不僅僅是添加,它和MySQL的replace一樣,如果發現相同類型的屬性,對應的屬性值將被覆蓋。
動態列現在正在快速發展期,還存在一定的限制。比如:
列必須通過數字來標識;
動態列對象最大只有536870911字節;
創建索引問題;
具體信息參考:http://kb.askmonty.org/en/dynamic-columns/
原文轉自:http://ourmysql.com/archives/1211