Cassandra – 數據結構設計概念和原則

當咱們設計一個關係型數據庫時,着手點是系統中的對象(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)

需求

  • 查詢指定地區的酒店

  • 查詢指定酒店的信息,包括名稱和所在地區

  • 查詢酒店附近有趣的地點

  • 查詢指定日期區間可預訂的房間

  • 查詢房間的評分

  • 提交客戶信息預訂房間

關係型數據庫設計

Screen Shot 2013-12-01 at 10.32.08 AM

Cassandra數據結構設計

Screen Shot 2013-12-01 at 10.34.12 AM

設計思路:

  1. 建立數據庫結構;

  2. 建立酒店和附近場所的數據結構。酒店是普通列族,附近場所是超級列族;

  3. 查詢指定地區的酒店,使用第二簇索引完成;

  4. 查詢一個酒店,而後查詢附近場所;

  5. 預訂酒店時,向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》

原文連接:Cassandra – 數據結構設計概念和原則

相關文章
相關標籤/搜索