cassandra学習ノート4
7076 ワード
次にcassandraのデータモデルを深く理解します.cassandraは、SQL文がないのではなく、NoRelationalを指すNoSQLデータベースです.cassandraのデータモデルはDynamoのkey/valueとBigTableを結合した.
のカラム向けの特徴で、主に大規模な分散データを格納するように設計されています.
PS:画像はここで不完全ですが、why?画像を見るには、画像アドレスを保存したりコピーしたりして、ブラウザで開くことができます.
一、cassandraデータモデルの特徴
1.key-valueモデルに基づく
cassandraのデータベースはColumnFamiliesで構成され、1つのColumnFamilyはkey-valueキー値ペアの集合です.リレーショナル・データベース・クラスと比較すると、ColumnFamilyはテーブルに相当し、key-valueキー値ペアはテーブルのレコードに相当します.
2.そのkey-valueモデルには多層ネストがある
ColumnFamilyの各レコードはkey-valueペアであり、value部分には無制限のColumnsが格納されています.各ColumnにはColumnNameとvalueがあるので、Columnも実際にはkey-valueペアです.しかしColumnのvalue部分はすでに最も基本的なデータ記憶ユニットであり,これ以上下にネストすることはできない.このネストの下で、ColumnFamilyの各レコードには、keyとColumnsからなるvalue(少なくとも1つのColumn)が含まれています.つまり、ColumnFamilyのvalueは中間者であり、実際にデータを格納しているのはvalueのColumnsです.下図のように.
上に述べたのは2層ネストで、もう1つの3層ネストがあります.この場合、ColumnFamilyの各レコードのvalue部分はColumnsではなく、SuperColumnと呼ばれる構造である.SuperColumnのkeyはSuperColumnnameで、そのvalue部分には次の図のように複数のColumnsを格納できます.
これには、次の3つのネストがあります.
SuperColumnにはSuperColumnが格納されないため、cassandraのネストは最大3層です.
3.ColumnとSuperColumnのnameセクションは、実際のデータを格納するために使用できます.
まず、それらのnameセクションは属性名として使用できます.たとえば、ユーザー・メールボックスを格納するレコードでは、次のようになります.
これは、従来のリレーショナル・データベースで慣れて使用されています.しかしcassandraでは,name部分を直接実際のデータを格納するために用いることもできる.たとえば、ユーザーのメールボックスのみを格納するレコードでは、次のことができます.
これは(a)cassandraの非構造化データ格納のおかげであり、データの格納に固定された位置(b)name部分を必要とせず、バイトストリーム格納(リレーショナル・データベースのフィールド名は文字でなければならない)を用いるため、任意のタイプのデータを格納することができる.
4.ColumnとSuperColumnはname順に格納
cassandraはvalueの順序でデータを格納するのではなく、nameに従って格納されることに注意してください.この点については後述する.
二、cassandraデータモデルの構成
このセクションではcassandraデータモデルの各構成部分について詳しく説明します.
1.Column
Columnは、データストアの最小単位です.name、value、timestamp(タイムスタンプ)を含む元祖です.次に、Columnの例を示します.
簡単に書けますが、後でタイムスタンプを省略し、Columnをname-valueペアと見なします.nameもvalueもバイトストリームで、長さに制限はありません.
2.SuperColumn
SuperColumnは本当のname-valueペアで、タイムスタンプはありません.また、valueセクションには無限のColumnが含まれ、Columnのnameセクションをキーワードとして使用できます.次はSuperColumnの例です.
その後、nameとvalueは書きません.上記では、次のように簡単に書きます.
3.Row
次のColumnFamilyを紹介する前に、Rowについてよく知っておきましょう.cassandraでは、ColumnFamilyごとに個別のファイルが存在し、このファイルはRow単位で格納され、ソートされます.そのため、できるだけ関連するColumnを同じColumnFamilyに置くべきです.
ColumnFamilyの構成は1行のRowであり、1つのRowはkey-value対であり、keyはデータがどの機械に存在するかを決定し(ノート2のtoken部分には説明がある)、value部分はColumnsまたはSuperColumnsである.
4.ColumnFamily
ColumnFamilyは無数のRowを含むことができる構造であり、Rowのvalue部分がColumnsまたはSuperColumnsであるため、ColumnFamilyは実際にColumnsとSuperColumnsの容器である.ColumnFamily対応リレーショナル・データベースの「テーブル」.ColumnFamilyとRowの簡単な例を次に示します(Columnを使用します).
次の図のようになります.
このレベルでは設計モードの要求はなく、Rowはそれらが含むべきColumnsリストを事前に定義していない.上述の例のように、李四は任意に1つのphoneのColumnを追加することができる.1つのRowには何千ものColumnsがあり、もう1つのRowには1つのColumnしかない可能性があります.cassandraはこの点では比べものにならない柔軟性を持っている.
5.属性がSuperのColumnFamily
上記の例はtypeが標準(Standard)ColumnFamilyであり、またSuperのColumnFamilyもあります.これは、ColumnFamilyを作成する際の定義によって異なります.名前の通り、SuperタイプのColumnFamilyのRowにはColumnsではなくSuperColumnsが格納されています.この場合、1つのRowのvalue部分にはいくつかのSuperColumnsがあり、1つのSuperColumnsのvalue部分にはいくつかのColumnsがある.次の図に示します.
なぜSuperColumnがあるのですか?SuperColumnは、通常のColumnよりも1対多の関係を提供します.Columnは、1つのkeyに関連付けられたColumnsのセットしか格納できません.これは、1つのkeyに複数のグループに関連付けられたColumnsを格納することができます.
ここでは、ユーザーが友人の住所を保存することができ、住所は郵便番号、街、都市などの異なる属性から構成されていると仮定します.この場合、SuperColumnを採用することができます.ColumnFamilyの場合、そのkeyはユーザー独自の名前を使用し、value部分はいくつかのSuperColumnsです.各SuperColumnsのname部分はユーザの友人の名前であり、value部分はいくつかのColumnsであり、アドレスの各属性を格納する.次に例を示します.
6.KeySpace
KeySpaceは最外層のコンテナであり、最大のコンテナでもあり、通常、1つのアプリケーションがKeySpaceに対応しています.すべてのColumnFamilyは、リレーショナル・データベースのDBに相当するKeySpaceにあります.
三、cassandraのデータ並べ替え
前に紹介したのはcassandraの各種データコンテナの概念で、今データモデルのもう一つの肝心なところであるデータがどのようにソートされているかを見てみましょう.cassandraはリレーショナル・データベースとは異なり、データを取り出すときにソート(orderby)を指定することはできません.データはクラスタに格納され、データベースに書き込まれると所定のルールに従って並べ替えられます.データを取り出すと、その順序が決まります.
前述したようにcassandraはvalueではなくnameでソートされます.cassandraがデータを書き込むと、rowのすべてのColumnsがnameに従って自動的にソートされます.ソートのルールはColumnFamilyのCompareWithオプションで決定されます.オプションは、BytesType、UTF 8 Type、LexicalUUIDType、TimeUUIDType、AsciiType、LongTypeです.これらのオプションは、LongTypeが64 bitLongタイプとして扱うように、ColumnNameを異なるデータ型としてソートします.次の例を示します.
LongTypeソートタイプを使用した結果、次のようになります.
UTF 8 Typeソートタイプを採用し、結果は:
これらのソート・ルールは、Row内のSuperColumnsのソートにも適用されますが、SuperColumn内のColumnsの場合、ソート・ルールを定義するパラメータはRowおよびSuperColumn内のCompareWithではなく、CompareSubcolumnsWithです.
ソートルールをカスタマイズし、インタフェースorgを実現することができます.apache.cassandra.db.marsha1.ITypeでいいです.
のカラム向けの特徴で、主に大規模な分散データを格納するように設計されています.
PS:画像はここで不完全ですが、why?画像を見るには、画像アドレスを保存したりコピーしたりして、ブラウザで開くことができます.
一、cassandraデータモデルの特徴
1.key-valueモデルに基づく
cassandraのデータベースはColumnFamiliesで構成され、1つのColumnFamilyはkey-valueキー値ペアの集合です.リレーショナル・データベース・クラスと比較すると、ColumnFamilyはテーブルに相当し、key-valueキー値ペアはテーブルのレコードに相当します.
2.そのkey-valueモデルには多層ネストがある
ColumnFamilyの各レコードはkey-valueペアであり、value部分には無制限のColumnsが格納されています.各ColumnにはColumnNameとvalueがあるので、Columnも実際にはkey-valueペアです.しかしColumnのvalue部分はすでに最も基本的なデータ記憶ユニットであり,これ以上下にネストすることはできない.このネストの下で、ColumnFamilyの各レコードには、keyとColumnsからなるvalue(少なくとも1つのColumn)が含まれています.つまり、ColumnFamilyのvalueは中間者であり、実際にデータを格納しているのはvalueのColumnsです.下図のように.
上に述べたのは2層ネストで、もう1つの3層ネストがあります.この場合、ColumnFamilyの各レコードのvalue部分はColumnsではなく、SuperColumnと呼ばれる構造である.SuperColumnのkeyはSuperColumnnameで、そのvalue部分には次の図のように複数のColumnsを格納できます.
これには、次の3つのネストがあります.
ColumnFamily: key - value(SuperColumn)
SuperColumn: key(SuperColumn name) - value(Column)
Column: key(Column name) - value
SuperColumnにはSuperColumnが格納されないため、cassandraのネストは最大3層です.
3.ColumnとSuperColumnのnameセクションは、実際のデータを格納するために使用できます.
まず、それらのnameセクションは属性名として使用できます.たとえば、ユーザー・メールボックスを格納するレコードでは、次のようになります.
Column name=Email,value="[email protected]";
これは、従来のリレーショナル・データベースで慣れて使用されています.しかしcassandraでは,name部分を直接実際のデータを格納するために用いることもできる.たとえば、ユーザーのメールボックスのみを格納するレコードでは、次のことができます.
Column name="[email protected]",value=null;
これは(a)cassandraの非構造化データ格納のおかげであり、データの格納に固定された位置(b)name部分を必要とせず、バイトストリーム格納(リレーショナル・データベースのフィールド名は文字でなければならない)を用いるため、任意のタイプのデータを格納することができる.
4.ColumnとSuperColumnはname順に格納
cassandraはvalueの順序でデータを格納するのではなく、nameに従って格納されることに注意してください.この点については後述する.
二、cassandraデータモデルの構成
このセクションではcassandraデータモデルの各構成部分について詳しく説明します.
1.Column
Columnは、データストアの最小単位です.name、value、timestamp(タイムスタンプ)を含む元祖です.次に、Columnの例を示します.
{
name:"age",
value:24,
timestamp:123456789
}
簡単に書けますが、後でタイムスタンプを省略し、Columnをname-valueペアと見なします.nameもvalueもバイトストリームで、長さに制限はありません.
2.SuperColumn
SuperColumnは本当のname-valueペアで、タイムスタンプはありません.また、valueセクションには無限のColumnが含まれ、Columnのnameセクションをキーワードとして使用できます.次はSuperColumnの例です.
{
name:"homeAddress"
//value Columns
value:
// key Column name
street:{name:"street",value:"XiTuCheng road"},
city:{name:"city",value:"BeiJing"},
zip:{name:"zip",value:"410083"},
}
その後、nameとvalueは書きません.上記では、次のように簡単に書きます.
homeAddress:{
street:"XiTuCheng road",
city:"BeiJing",
zip:"410083",
}
3.Row
次のColumnFamilyを紹介する前に、Rowについてよく知っておきましょう.cassandraでは、ColumnFamilyごとに個別のファイルが存在し、このファイルはRow単位で格納され、ソートされます.そのため、できるだけ関連するColumnを同じColumnFamilyに置くべきです.
ColumnFamilyの構成は1行のRowであり、1つのRowはkey-value対であり、keyはデータがどの機械に存在するかを決定し(ノート2のtoken部分には説明がある)、value部分はColumnsまたはSuperColumnsである.
4.ColumnFamily
ColumnFamilyは無数のRowを含むことができる構造であり、Rowのvalue部分がColumnsまたはSuperColumnsであるため、ColumnFamilyは実際にColumnsとSuperColumnsの容器である.ColumnFamily対応リレーショナル・データベースの「テーブル」.ColumnFamilyとRowの簡単な例を次に示します(Columnを使用します).
User={// ColumnFamily, User
zhangsan:{// Row,Row key zhangsan
// value Columns,
username:"zhangsan",
email:"[email protected]",
},// Row
lisi:{// Row,Row key lisi
//value , Columns,lisi
username:"lisi",
email:"[email protected]",
phone:"123456"
},//Row
}
次の図のようになります.
このレベルでは設計モードの要求はなく、Rowはそれらが含むべきColumnsリストを事前に定義していない.上述の例のように、李四は任意に1つのphoneのColumnを追加することができる.1つのRowには何千ものColumnsがあり、もう1つのRowには1つのColumnしかない可能性があります.cassandraはこの点では比べものにならない柔軟性を持っている.
5.属性がSuperのColumnFamily
上記の例はtypeが標準(Standard)ColumnFamilyであり、またSuperのColumnFamilyもあります.これは、ColumnFamilyを作成する際の定義によって異なります.名前の通り、SuperタイプのColumnFamilyのRowにはColumnsではなくSuperColumnsが格納されています.この場合、1つのRowのvalue部分にはいくつかのSuperColumnsがあり、1つのSuperColumnsのvalue部分にはいくつかのColumnsがある.次の図に示します.
なぜSuperColumnがあるのですか?SuperColumnは、通常のColumnよりも1対多の関係を提供します.Columnは、1つのkeyに関連付けられたColumnsのセットしか格納できません.これは、1つのkeyに複数のグループに関連付けられたColumnsを格納することができます.
ここでは、ユーザーが友人の住所を保存することができ、住所は郵便番号、街、都市などの異なる属性から構成されていると仮定します.この場合、SuperColumnを採用することができます.ColumnFamilyの場合、そのkeyはユーザー独自の名前を使用し、value部分はいくつかのSuperColumnsです.各SuperColumnsのname部分はユーザの友人の名前であり、value部分はいくつかのColumnsであり、アドレスの各属性を格納する.次に例を示します.
AddressBook={// SuperColumnFamily, AddressBook
zhangsan:{// Row,key zhangsan,
// Row Value , SuperColumns
lisi:{// SuperColumn name
// Columns,
street:"XiTuCheng road",
zip:"410083",
city:"BeiJing"
},
wangwu:{// SuperColumn
street:"XiTuCheng road",
zip:"410083",
city:"BeiJing"
},
zhaoliu:{//SuperColumn
street:"XiTuCheng road",
zip:"410083",
city:"BeiJing"
},
.......
}//end the row of zhangsan
lisi:{// Row,key lisi,
wangwu:{//SuperColumn
street:"XiTuCheng road",
zip:"410083",
city:"BeiJing"
},
zhangsan:{//SuperColumn
street:"XiTuCheng road",
zip:"410083",
city:"BeiJing"
},
.......
}
}
6.KeySpace
KeySpaceは最外層のコンテナであり、最大のコンテナでもあり、通常、1つのアプリケーションがKeySpaceに対応しています.すべてのColumnFamilyは、リレーショナル・データベースのDBに相当するKeySpaceにあります.
三、cassandraのデータ並べ替え
前に紹介したのはcassandraの各種データコンテナの概念で、今データモデルのもう一つの肝心なところであるデータがどのようにソートされているかを見てみましょう.cassandraはリレーショナル・データベースとは異なり、データを取り出すときにソート(orderby)を指定することはできません.データはクラスタに格納され、データベースに書き込まれると所定のルールに従って並べ替えられます.データを取り出すと、その順序が決まります.
前述したようにcassandraはvalueではなくnameでソートされます.cassandraがデータを書き込むと、rowのすべてのColumnsがnameに従って自動的にソートされます.ソートのルールはColumnFamilyのCompareWithオプションで決定されます.オプションは、BytesType、UTF 8 Type、LexicalUUIDType、TimeUUIDType、AsciiType、LongTypeです.これらのオプションは、LongTypeが64 bitLongタイプとして扱うように、ColumnNameを異なるデータ型としてソートします.次の例を示します.
{name: 123, value: “hello there”},
{name: 832416, value: “kjjkbcjkcbbd”},
{name: 3, value: “101010101010″},
{name: 976, value: “kjjkbcjkcbbd”}
LongTypeソートタイプを使用した結果、次のようになります.
{name: 3, value: “101010101010″},
{name: 123, value: “hello there”},
{name: 976, value: “kjjkbcjkcbbd”},
{name: 832416, value: “kjjkbcjkcbbd”}
UTF 8 Typeソートタイプを採用し、結果は:
{name: 123, value: “hello there”},
{name: 3, value: “101010101010″},
{name: 832416, value: “kjjkbcjkcbbd”},
{name: 976, value: “kjjkbcjkcbbd”}
これらのソート・ルールは、Row内のSuperColumnsのソートにも適用されますが、SuperColumn内のColumnsの場合、ソート・ルールを定義するパラメータはRowおよびSuperColumn内のCompareWithではなく、CompareSubcolumnsWithです.
ソートルールをカスタマイズし、インタフェースorgを実現することができます.apache.cassandra.db.marsha1.ITypeでいいです.