當咱們設計一個關係型數據庫時,着手點是系統中的對象(Entities),再爲對象加上屬性描述,從而轉換爲表設計。在關係型數據庫中咱們不會考慮表的行,由於肯定表的字段名稱以後,數據逐行寫入,數據庫會管理行數據空間。數據庫
寬行仍是窄行(Wild Rows or Skinny Rows)apache
但在Cassandra裏,咱們必須在設計時考慮列族的行數,這取決於定義的列的數目。一般會有兩種選擇:數據結構
寬行(Wild Rows):在每行中包含數量巨大(一般會達到百萬 級之多)的列,但只有不多的行數;less
窄行(Skinny Rows):比較像關係型數據庫的使用方法,有少許較爲固定的列,使用不一樣、不斷增長的行來存儲。數據庫設計
列排序(Column Sorting)ide
Cassandra不支持查詢語言,也不支持查詢時使用Order By對數據進行排序,排序是須要設計時考慮。在定義列族時,能夠包含一個名爲CompareWith的元素,這個元素決定了此列族的排序規則。Cassandra提供的排序支持如下幾種數據類型,包含了字符、字節、數字和日期時間:AsciiType, BytesType, LexicalUUIDType, Integer Type, LongType, TimeUUIDType, or UTF8Type.ui
設計原則(Design Principles)spa
Cassandra的數據結構設計與關係型數據庫徹底不一樣,核心有三大設計原則:物化視圖、無值列和複合鍵。設計
物化視圖(Materialized View)rest
在關係型數據庫中,咱們一般會使用Where條件查詢表的部分結果集,好比咱們設計了Users表,有一個City字段,而後使用Where City = 'New York'來進行查詢。
SELECT * FROM USERS WHERE CITY = "New York"
在Cassandra中,咱們會直接建立一個新的列族名爲CityUsers,以City爲行名稱,列爲全部在這個City中的Users.
$ create column family CityUser; $ set CityUsers["NewYork"]["UserID"] = "1, 2, 3, 4";
這在Cassandra裏是一種很是廣泛和常見的設計,物化視圖爲查詢而設計一份映射數據,而不是從原始數據中去尋找。
無值列(Valueless Column)
以上面的Users/CityUsers爲例,咱們設計了行名爲City,列爲Users的列族,由於數據是從Users列族中映射過來的,其實咱們並不須要爲列指定內容,它能夠直接引用Users表中的數據。
複合鍵(Aggregate Key)在《Cassandra – 理解關鍵概念和數據模型》爲你們介紹過複合鍵的用法,在Cassandra中,大量使用複合鍵也是設計原則之一。 在設計Cassandra數據結構時,應當緊緊把握的兩點:
從查詢開始:Cassandra不是爲對象而設計,而是爲查詢而設計。先看看系統中須要的查詢是什麼樣的,再着手設計;
系統時間:由於Cassandra的列結構包含時間戳,因此你必須考慮從不一樣客戶端過來的時間格式,有必要指定一個統一的標準時間,固然,這將帶來本地時間轉換問題。
數據設計示例(Data Design Sample)
需求
查詢指定地區的酒店
查詢指定酒店的信息,包括名稱和所在地區
查詢酒店附近有趣的地點
查詢指定日期區間可預訂的房間
查詢房間的評分
提交客戶信息預訂房間
關係型數據庫設計
Cassandra數據結構設計
設計思路:
建立數據庫結構;
建立酒店和附近場所的數據結構。酒店是普通列族,附近場所是超級列族;
查詢指定地區的酒店,使用第二簇索引完成;
查詢一個酒店,而後查詢附近場所;
預訂酒店時,向Reservation列族寫入行數據。
Cassandra.yaml
keyspaces: - name: Hotelier replica_placement_strategy: org.apache.cassandra.locator.RackUnawareStrategy replication_factor: 1 column_families: - name: Hotel compare_with: UTF8Type - name: HotelByCity compare_with: UTF8Type - name: Guest compare_with: BytesType - name: Reservation compare_with: TimeUUIDType - name: PointOfInterest column_type: Super compare_with: UTF8Type compare_subcolumns_with: UTF8Type - name: Room column_type: Super compare_with: BytesType compare_subcolumns_with: BytesType - name: RoomAvailability column_type: Super compare_with: BytesType compare_subcolumns_with: BytesType
本文參考自《Cassandra: The Definitive Guide》