成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

NoSQL那些事:51CTO帶您走進列數據庫

原創
數據庫 其他數據庫 新聞
列數據庫算不算NoSQL,目前來看還是存在爭議的。51CTO數據庫頻道認為還是要一分為二的看待,按列存儲也含有一定的關系,因此嚴格意義上說列數據庫有一些還是屬于關系型數據庫的。

【51CTO外電頭條】列數據庫出名可能是因為Google BigTable的出現,它表面上和關系數據庫類似,但實際上卻有著本質的不同,一個是按行存儲數據(關系數據庫),一個是按列存儲數據(列數據庫)的,你不能將適用于關系數據庫的解決方案強加給列數據庫,因為列數據庫是沒有關系的。51CTO數據庫頻道向您推薦《NoSQL:關系型數據庫的終結者?》專題,以便于您更好的理解NoSQL。

搞清楚下面幾個概念才能理解列數據庫是如何工作的:

◆Column Family

◆Super Column

◆Column

列數據庫中的Column和Super Column是不占位的,意味著如果它們里面沒有值,它們只占用0字節,Column Family與傳統數據庫中的表類似,但和表又不一樣,在Column Family中的唯一定義是名稱和鍵(Key)排序選項(沒有任何模式)。

我個人認為Column Family數據庫(CFDB)可能是消除抽象設計的最佳方法,因為CFDB中的一切都是圍繞真實的物理模型的。

◆Column Family – Column Family指定數據如何存儲在磁盤上的,一個Column Family中的所有數據都將保存在相同的文件中,一個Column Family可以容納多個Super Column或Column。

◆Super Column - Super Column是一個字典,它是一個包含其它列的列,但一個Super Column不能包含另一個Super Column。

◆Column -  Column是一個由名稱,值和時間戳組成的三元組(我將忽略時間戳,把它當作一個Key/Value對看待)。

最重要的是要明白CFDB架構設計的外圍重要性,如果架構都不正確,那基本上就無法獲取數據,CFDB通常按照鍵或鍵范圍提供一兩種形式的查詢,這是很有意義的,因為CDFB通常是分布式的,鍵決定了數據的真實物理位置,這是因為數據是基于Column Family的排序順序存儲的,你是沒有辦法改變排序方式的(除了選擇升序和降序外)。

和關系數據庫中的排序順序不一樣,列數據庫的排序順序不受列的值影響,只受列名的影響。

假設在Users Column Family,@ayende行中,我們將列“name”設為“Ayende Rahine”,列“location”設為“Israel”,CFDB將會象Users Column Family文件一樣對它們進行排序:

  1. @ayende/location = “Israel”  
  2. @ayende/name = “Ayende Rahien” 

這是因為排序時“location”小于“name”的緣故,如果在Friends Column Family中有一個Super Column,用戶“@ayende”有兩個朋友,它們將會象Friends Column Family文件那樣進行存儲:

  1. @ayende/friends/arava= 945  
  2. @ayende/friends/rose = 14 

記住,這個屬性對理解CFDB是如何工作的相當重要,我們以Twitter模型為例,我們需要存儲:用戶和推(tweet),我們定義了三個Column Family:

◆Users – 按UTF-8排序

◆Tweets – 按連續GUID排序

◆UsersTweets - Super Column Family,按連續GUID排序

我們創建一個用戶(我使用name參數標志列名和值,key參數表示行的鍵,Column Family是Users):

  1. cfdb.Users.Insert(key: “@ayende”, name: “Ayende Rahine”, location: “Israel”, profession: “Wizard”); 

下圖是一個可視化的表示,注意與關系數據庫的區別。

保存用戶信息的存儲樣式

圖 1 保存用戶信息的存儲樣式

現在我們創建一個推:

  1. var firstTweetKey = “Tweets/” + SequentialGuid.Create();  
  2. cfdb.Tweets.Insert(key: firstTweetKey, application: “TweekDeck”, text: “Err, is this on?”, private: true);  
  3. var secondTweetKey = “Tweets/” + SequentialGuid.Create();  
  4. cfdb.Tweets.Insert(key: secondTweetKey, app: “Twhirl”, version: “1.2”, 
  5. text: “Well, I guess this is my mandatory hello world”, publictrue); 

下面是它真實的存儲格式:

保存推信息的存儲樣式

圖 2 保存推信息的存儲樣式

這里有幾件事需要注意:

◆在這里,Key不重要,重要的是它是連續的,因為后面會根據它進行排序;

◆兩個行上面有不同的數據列;

◆我們實際上沒有任何方法將用戶和推關聯起來。

在關系數據庫中,我們通常會定義一個名叫UserId的列,這樣我們可以通過它將推鏈接回用戶,此外,關系允許我們按用戶ID查詢推,但CFDB沒有這樣的功能,無法根據列的值進行查詢,也沒有辦法按照列進行查詢,CFDB只能根據鍵查詢,我們以UsersTweets Column Family為例進行說明:

  1. cfdb.UsersTweets.Insert(key: “@ayende”,  
  2. timeline: { SequentialGuid.Create(): firstTweetKey } );  
  3. cfdb.UsersTweets.Insert(key: “@ayende”,  
  4. timeline: { SequentialGuid.Create(): secondTweetKey } ); 

在CFDB上,它看起來象:

用戶和推關聯

圖 3 用戶和推關聯

這里我們向UsersTweets Column Family插入數據,行的Key是“@ayende”,Super Column timeline有兩列,每個列的名字是一個連續的GUID,這意味著我們可以根據它進行排序,實際上我們是用一個Super Column創建了一個行,它又包含兩列,列名是一個GUID,每一列的值是Tweets表中一個行的鍵。

問題:我們可以在Users Column Family中創建一個Super Column存儲關系嗎?是的,可以這么做,但一個Column Family要么容納Super Column,要么容納Column,不能二者兼得。

為了獲得某個用戶發的推,我們需要執行:

  1. var tweetIds =   
  2.       cfdb.UsersTweets.Get(“@ayende”)  
  3.              .Fetch(“timeline”)  
  4.              .Take(25)  
  5.              .OrderByDescending()  
  6.             .Select(x=>x.Value);  
  7. var tweets = cfdb.Tweets.Get(tweetIds); 

從本質上來講,我們執行了兩個查詢,一個是在UsersTweets Column Family執行的,用行鍵“@ayende”請求timeline Super Column中的列和值,然后在Tweets Column Family上執行另一個查詢,獲得真正的推。

因為數據是按照列名排序的,同時我們選擇的是降序排序,我們獲得了該用戶的最后25個推。

如果我想展示最后25個推該怎么辦?很簡單,只需要查詢Tweets Column Family中的推,然后按鍵倒序排序即可。

為什么CFDB有如此多的限制?

你可能已經注意到我多次提及RDBMS和CFDB的差異,我認為CFDB理解起來確實有點難,即使它表面上和關系數據庫很接近,但它的限制卻很多,沒有連接,沒有真正的查詢功能(除了主鍵外),越是熟悉關系數據庫,對理解CFDB越是有影響。

之所以有這么多的限制,主要原因是CFDB設計目標就是運行在多臺機器上,存儲大量信息的,在關系數據庫中幾乎是不可能存儲這么多數據的,即使是象Oracle RAC這樣的集群數據庫也存儲不了那么多數據。

CFDB不提供連接的原因是,連接需要你能掃描整個數據集,這個時候要么使用一個視圖,否則就只有掃描整個數據庫了,這會造成性能急劇下降,因此CFDB必須避免出現這種情況。

CFDB不提供按列或按值查詢的原因是,因為這樣要么需要一個索引,要么掃描整個數據集,CFDB將查詢限制到只能按鍵進行查詢,確保它能準確地知道查詢應在哪個節點上運行,這意味著每個查詢只會掃描一小段數據集,性能自然會好很多。

理解列數據庫需要一種截然不同的思維方式,雖然我沒有CFDB實戰經驗,我可以想像得到,使用它們遷移是個麻煩事,但它確實是獲得高可擴展數據存儲的最好方式。

到最后,51CTO數據庫的編輯了解到,有些專業人士還是認為列數據庫也不全是NoSQL。盡管有Sybase IQ這樣的產品,但是列數據庫當中還是有關系存在的。

作者簡介

Oren Eini

Ayende Rahien只是網名,作者的真實名字叫做Oren Eini,他是一名經驗豐富的開發人員/架構師,主要精力放在CLR,構建商業應用和開發生產力框架和工具上,他也是多個著名開源項目的積極成員,包括NHibernate,Castle等,另外,Oren Eini還創建了多個開源項目,如Rhino Mocks,NHibernate Query Analyzer,Rhino Commons等。

原文出處:ayende.com/Blog/archive/2010/05/14/that-no-sql-thing-Column-family-databases.aspx

【編輯推薦】

  1. 用NoSQL來替代MySQL在Digg中的原因
  2. MongoDB CEO談NoSQL的大數據量處理能力
  3. 51CTO專訪蓋國強:NoSQL很火 但還需市場檢驗
  4. 詳解NoSQL數據庫使用實例
  5. 云計算時代NoSQL當道 關系數據庫日薄西山

 

責任編輯:彭凡 來源: 51CTO
相關推薦

2011-08-23 10:12:45

IBM云計算

2015-05-28 20:46:06

2012-06-27 13:22:52

2015-05-28 22:46:29

2011-09-08 13:50:51

51cto 51CTO

2021-07-09 13:58:16

MySQL數據庫運維

2010-12-10 13:21:47

51CTO博客大賽

2017-03-30 14:10:16

51CTO 學院

2011-03-28 08:51:47

51CTO沙龍Windows運維

2010-04-06 12:26:16

51CTO清明節

2010-08-26 09:01:27

Infobright

2011-05-10 11:23:13

Windows

2011-09-08 13:26:27

51cto 51CTO

2018-04-24 10:00:20

2010-04-02 22:02:19

蓋國強NoSQL

2011-06-01 16:35:50

51CTO投稿

2021-12-08 09:16:00

社區編輯加盟指南

2010-01-19 11:21:20

51CTO駐站專家

2010-04-21 11:06:15

2010-11-15 11:49:18

Oracle數據庫的段
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99re在线视频观看 | 欧美日韩电影在线 | 国产一区 | 国产高清一二三区 | 亚洲国产精品久久 | 国产精品久久片 | 久久久在线视频 | 久在线观看 | 亚洲黄色片免费观看 | 人人cao | 国产福利视频 | 国产中文原创 | 亚洲精品久久久 | 欧美日高清视频 | 日韩在线视频一区二区三区 | 欧美日韩国产精品一区二区 | 亚州精品天堂中文字幕 | 亚洲欧美日韩在线一区二区 | 亚洲精品福利视频 | 成人免费影院 | 国产精品性做久久久久久 | 欧美一级片在线看 | 成年免费在线观看 | 欧美一区二区免费在线 | 国产在线视频三区 | 国产亚洲精品一区二区三区 | 亚洲综合中文字幕在线观看 | 国产不卡在线观看 | 日本免费黄色 | 中文字幕一区二区三区在线观看 | 日韩一区二区在线视频 | 久久精品国产一区二区三区 | 国产99久久久国产精品 | 欧美激情视频一区二区三区免费 | 欧美日韩美女 | 日日碰狠狠躁久久躁婷婷 | 日韩欧美国产一区二区 | 亚洲国产精品一区二区第一页 | 国产.com| 亚洲欧美日韩久久 | www.中文字幕 |