MariaDB為NoSQL的擴展提供的另外一個特性 就是:動態(tài)列。對表的每一行都可以有一個“虛擬列”,該列可以用于保存一個對象的不同屬性,每個屬性在各行之間可以完全不同,“虛擬列”的個數(shù)和內(nèi)容完全有應(yīng)用程序來控制和解釋。 NoSQL的另外一個好處就是,我存儲
MariaDB為NoSQL的擴展提供的另外一個特性 就是:動態(tài)列。對表的每一行都可以有一個“虛擬列”,該列可以用于保存一個對象的不同屬性,每個屬性在各行之間可以完全不同,“虛擬列”的個數(shù)和內(nèi)容完全有應(yīng)用程序來控制和解釋。
NoSQL的另外一個好處就是,我存儲的東西是一個沒有結(jié)構(gòu)的東西,而數(shù)據(jù)庫則要求是一個固定列名,確定長度的一個個列。為了滿足這個需求,MariaDB引入了動態(tài)列的概念。它允許你在每一行上有一個“虛擬列”。這個虛擬列被作為一個額外的字段存在在blob中,并且有一系列函數(shù)用于創(chuàng)建,更新,刪除,檢查,查詢這個列。 空說無憑,舉例為證。我們先創(chuàng)建一個表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);
并插入一些數(shù)據(jù):
insert into t1 (name, type, price, dynstr) values ("Funny shirt", "shirt", 10.0, COLUMN_CREATE(1, "blue", 10, "XL")), ("nokia", "phone", 9, 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()函數(shù)來創(chuàng)建動態(tài)列。插入的四條數(shù)據(jù)。針對各個不同的商品定義不同的屬性。比如1在各個商品中表示的是顏色;3表示的是操作系統(tǒng);10表示的是大小。每行數(shù)據(jù)的屬性不完全相同,也不要求所有的屬性值都需要包含在動態(tài)列中。那么,動態(tài)列的有哪些屬性要怎么查看列:
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 | 9.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()可以列出動態(tài)列到底有哪些屬性,這樣的話我們就可以根據(jù)屬性過濾:
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的所有產(chǎn)品哪些屬性,第二條SQL查詢了存在顏色屬性的所有行。對應(yīng)的COLUMN_GET() 函數(shù)表示獲取對應(yīng)屬性的屬性值。COLUMN_EXISTS()函數(shù)表示動態(tài)列中是否存儲了該屬性值。我們也注意到,現(xiàn)在動態(tài)列的所有屬性都是用數(shù)字來表示的。
前面都是對動態(tài)列創(chuàng)建和查詢的例子,我們再看看更新的例子。比如我們需要對類型為‘computer’的數(shù)據(jù)加4G內(nèi)存:?
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()函數(shù)會給每個’computer’的行加上新的屬性,屬性值為‘4G ram’。不過,COLUMN_ADD()并不僅僅是添加,它和MySQL的replace一樣,如果發(fā)現(xiàn)相同類型的屬性,對應(yīng)的屬性值將被覆蓋。
動態(tài)列現(xiàn)在正在快速發(fā)展期,還存在一定的。比如:
具體信息參考:http://kb.askmonty.org/en/dynamic-columns/
原文地址:MariaDB 新特性介紹-動態(tài)虛擬列, 感謝原作者分享。
Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號-2
違法及侵權(quán)請聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市萬商天勤律師事務(wù)所王興未律師提供法律服務(wù)