##巢狀的排序過的map結構
cassandra的column families ==>map[rowkey,sortedmap[column_name,value]]==>key 排序過
資料模型的建立根據查詢業務來
cql的schema定義的列名相當於乙個主體,主體的值才算列名
create table events (
key text,
column1 int,
column2 int,
value text,
primary key(key, column1, column2)
) with compact storage
key的值才是cassandra的列名,所以說列是動態增加,但是主體key必須是固定的,
###更複雜的例子
乙個更複雜一點的例子:
create table example ( partitionkey1 text, partitionkey2 text, clusterkey1 text, clusterkey2 text, normalfield1 text, normalfield2 text, primary key ( (partitionkey1, partitionkey2), clusterkey1, clusterkey2 ) );
這裡我們用字段在內部儲存時的型別來命名字段。而且我們已經包含了所有情形。這裡的主鍵不僅僅是復合主鍵,而且是復合partition key (在primary key部分的前半段,用括號括起的部分)和復合cluster key。
然後插入一些行:
insert into example ( partitionkey1, partitionkey2, clusterkey1, clusterkey2, normalfield1, normalfield2 ) values ( 'partitionval1', 'partitionval2', 'clusterval1', 'clusterval2', 'normalval1', 'normalval2');
資料怎麼儲存呢?
rowkey: partitionval1:partitionval2 => (column=clusterval1:clusterval2:, value=, timestamp=1374630892473000) => (column=clusterval1:clusterval2:normalfield1, value=6e6f726d616c56616c31, timestamp=1374630892473000) => (column=clusterval1:clusterval2:normalfield2, value=6e6f726d616c56616c32, timestamp=1374630892473000)
注意partitionval1和partitionval2,我們可以發現rowkey(也稱為partition key)是這兩個字段值的組合
clusterval1和clusterval2這兩個cluster key的 值(注意是值不是欄位名稱)的組合,成為了每乙個非主鍵列名的字首
非主鍵列的值,比如normalfield1和normalfield2的值,是列名加上cluster key的值之後的列的值
每乙個row中的列,是按列名排序的,而因為cluster key的值成為非主鍵列名的字首,每個row下的所有的列,實際上首先按照cluster key的值排序,然後再按照cql裡的列名排序
##模型設計
集群負載均衡最終依靠rowkey選擇;相反地,rowkey也決定row的長度。所以在設計模型的時候要謹記負載均衡。
因為row不會跨節點分割,所以單個row必須適應節點磁碟大小
一種減輕問題的方式是新增一些資訊到rowkey——事件型別、機器id,或者適應你用例的類似值。
確保column key和row key是唯一的
cassandra所有操作都是upsert(不存在插入,存在則更新)操作。
保持column name簡短--key的值
對某個row key的一次mutation操作是原子的。所以當你需要事務性的時候,嘗試設計你的模型,讓它一次永遠只更新一行。
在cassandra中,ttl(存活時間)不是設定在column family上,它設定於每個column value,一旦設定後就很難改變。或者說,如果建立column時候沒有設定,那之後就很難對其設定ttl。
composite columns 優於 super columns
最佳實踐 Flutter 最佳實踐
最佳實踐是乙個領域可以接受的專業標準,對於任何程式語言來說,提高 質量 可讀性 可維護性和健壯性都非常重要。讓我們探索一些設計和開發flutter應用程式的最佳實踐。class enum typedef和extension應採用駝峰命名uppercamelcase規則。class mainscree...
JUnit最佳實踐
junit最佳實踐 cherami 轉貼 參與分 20053,專家分 4960 發表 2003 9 16 下午7 57 版本 1.0 閱讀 3899次 martin fowler說過 當你試圖列印輸出一些資訊或除錯乙個表示式時,寫一些測試 來替代那些傳統的方法。一開始,你會發現你總是要建立一些新的f...
SVN最佳實踐
楊爭 subversion是新一代的版本控制工具,由於其優於cvs的一些特點,得到了越來越多人的關注和使用,本人根據自己使用svn的經驗,寫了這篇文章,希望對大家有所幫助,其中有些實踐並不是僅僅適用於svn,對其他版本控制工具也是適用的。1 養成良好的記錄日誌的習慣.svn ci提交,最好在日誌中記...