MariaDB 特性介紹-動態虛擬列

發表于:2013-07-24來源:OurMySLQ作者:不詳點擊數: 標簽:myslq
MariaDB 特性介紹-動態虛擬列 MariaDB為NoSQL的擴展提供的另外一個特性 就是:動態列。對表的每一行都可以有一個“虛擬列”,該列可以用于保存一個對象的不同屬性,每個屬性在各行之間可以完全不同,“虛擬列”的個數和內容完全有應用程序來控制和解釋

  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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97