• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 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

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>