DynamoDB 補充

在DynamoDB之中,同一個用戶可以在不同地區創建多張同名表。只要在一個地區中保持表名唯一即可。在DynamoDB執行createTable是一個異步操作,當接收到CreateTable請求時,DynamoDB實時返回一個處理響應,同時將其標記爲CREATING狀態。只有當表真正建完之後,DynamoDB纔會將表狀態更改爲ACTIVE狀態。用戶只能在ACTIVE狀態的表中進行讀寫操作。

用戶可以在創建表時,同時在表中創建二級索引。如果用戶想在多張表中都創建二級索引,那麼目前來說只能順序創建,DynamoDB引擎還無法做到並行創建。在一個時間點,只能有一張表和其二級索引處於CREATING狀態。在同一張表中,最多隻能創建5個二級索引。(索引太多,和沒有索引效果一樣。這點和Oracle的處理機制很類似。因此最多隻能創建5個索引)

因爲createTable是一個異步操作,所以只能通過查詢才能得知目前表的具體狀態。查詢API是DescribleTable。

OK,CreateTable的注意事項,我們交代完了。 下面我們開始講解各項參數:

AttributeDefinitions 必填項

表示表或者索引的Key屬性數組。允許最大的長度是255.其允許的值爲:

S 表示Key類型爲String
N 表示Key類型爲Number
B 表示Key類型爲Binary
KeySchema 必填項

指定表或者索引的主鍵。在KeySchema中的Key必須首先在AttributeDefinitions中存在。 每一個KeySchema都包括以下兩項:

AttributeName: Key名稱
KeyType: 主鍵類型,HASH或者RANGE(二選一)。

因爲在DynamoDB之中,必須存在一個HASH類型的主鍵,所以在KeySchema中,必須有指定一個HASH類型的主鍵。

如果需要創建一個包含hash和range類型的索引或者主鍵時,必須按照先指定hash鍵,然後在指定range鍵的順序。

因此在KeySchema屬性中,至少要有一組定義。

剛纔關係型數據庫轉到NOSQL數據庫的同學,可能會進入到一個誤區。就是在KeySchema中將表所有字段都定義好。這在DynamoDB中是沒有必要的。

在DynamoDB之中,除了主鍵和索引需要在KeySchema中定義好字段。其它所有字段都是可以在運行時,自行添加的。比如說,現在有兩個字段。當執行代碼時,又多了個字段。dynamodb會自動添加上這個字段。因爲在DynamoDB之中,都是用K,V鍵值對進行存儲的。所以只要Key指定好了,Value可以隨時添加刪除。

ProvisionedThroughput 必填項

設置此表的預計數據吞吐量。這個值,可以等表創建成功之後通過UpdateTable API進行修改。

一個讀取容量單位=對大小爲4KB的項目每秒執行一次強一致性讀取,或者每秒執行兩次最終一致性讀取。
一個寫入容量單位=對大小爲1KB的項目,每秒進行一次寫入。

ReadCapacityUnits最小單位爲1.
WriteCapacityUnits最小單位也爲1.

TableName 必填項

這個屬性,呵呵想必都能看懂。 必填項…. 長度不得超過255個字符,最小不能少於3個字符。只允許使用[a-zA-Z0-9_.-]+這裏面的有效合法字符。

GlobalSecondaryIndexes 可選項

每張表可以最多創建5個全局二級索引。在每個全局二級索引定義中包括以下三項:

IndexName: 索引名稱。
KeySchema: 定義索引使用的Key
Projection:指定投影類型。DynamoDB會自動創建主鍵或者索引中定義Key(組合)的投影。投影類型一共分爲三類:
KEYS_ONLY。 只拷貝主鍵和索引中的字段到投影中
INCLUDE。只將指定的字段拷貝到投影中,指定的KEY由NonKeyAttributes指定。
ALL。 所有的字段都拷貝到投影。

NonKeyAttributes :用來指定需要拷貝到投影中的字段數組。此屬性中指定的字段總數不得超過20個。如果在不同投影中指定了相同的字段,那麼計算總數時會被計算兩次。

ProvisionedThroughput :設定全局二級索引的讀寫吞吐總量。最小值都爲1.

LocalSecondaryIndexes 可選項

在一張表當中,最多創建5個本地二級索引。每個二級索引將會對應一個字段的Hash集合。每張表對於hash集合10GB的總容量上限,但對於每個本地二級索引則沒有容量上限限制。

此屬性包括:IndexName KeySchema Projection ,含義同全局二級索引相同。

StreamSpecification 可選項

此屬性用來設置此表的DynamoDB 數據流。設定項爲:

StreamEnabled:設定Stream是否開啓,參數值爲true或者fasle。
StreamViewType: 當表中數據被修改時,DynamoDB決定何種數據可以被同步到此表的stream流中。有效值爲:

KEYS_ONLY,KEY發生變化時,將KEYS寫入數據流。
NEW_IMAGE,當數據發生變化後,將變化數據寫入數據流。
OLD_IMAGE,當數據發生變化前,將變化數據寫入數據流。
NEW_AND_OLD_IMAGES,新舊數據都寫入數據流。

下面是CreateTable所返回的響應schema:

{
“TableDescription”: {
“AttributeDefinitions”: [
{
“AttributeName”: “string”,
“AttributeType”: “string”
}
],
“CreationDateTime”: number,
“GlobalSecondaryIndexes”: [
{
“Backfilling”: boolean,
“IndexArn”: “string”,
“IndexName”: “string”,
“IndexSizeBytes”: number,
“IndexStatus”: “string”,
“ItemCount”: number,
“KeySchema”: [
{
“AttributeName”: “string”,
“KeyType”: “string”
}
],
“Projection”: {
“NonKeyAttributes”: [
“string”
],
“ProjectionType”: “string”
},
“ProvisionedThroughput”: {
“LastDecreaseDateTime”: number,
“LastIncreaseDateTime”: number,
“NumberOfDecreasesToday”: number,
“ReadCapacityUnits”: number,
“WriteCapacityUnits”: number
}
}
],
“ItemCount”: number,
“KeySchema”: [
{
“AttributeName”: “string”,
“KeyType”: “string”
}
],
“LatestStreamArn”: “string”,
“LatestStreamLabel”: “string”,
“LocalSecondaryIndexes”: [
{
“IndexArn”: “string”,
“IndexName”: “string”,
“IndexSizeBytes”: number,
“ItemCount”: number,
“KeySchema”: [
{
“AttributeName”: “string”,
“KeyType”: “string”
}
],
“Projection”: {
“NonKeyAttributes”: [
“string”
],
“ProjectionType”: “string”
}
}
],
“ProvisionedThroughput”: {
“LastDecreaseDateTime”: number,
“LastIncreaseDateTime”: number,
“NumberOfDecreasesToday”: number,
“ReadCapacityUnits”: number,
“WriteCapacityUnits”: number
},
“StreamSpecification”: {
“StreamEnabled”: boolean,
“StreamViewType”: “string”
},
“TableArn”: “string”,
“TableName”: “string”,
“TableSizeBytes”: number,
“TableStatus”: “string”
}
}

增強大家對createTable參數的理解,下面提供一個示例,請看:

{
“AttributeDefinitions”: [
{
“AttributeName”: “ForumName”,
“AttributeType”: “S”
},
{
“AttributeName”: “Subject”,
“AttributeType”: “S”
},
{
“AttributeName”: “LastPostDateTime”,
“AttributeType”: “S”
}
],
“TableName”: “Thread”,
“KeySchema”: [
{
“AttributeName”: “ForumName”,
“KeyType”: “HASH”
},
{
“AttributeName”: “Subject”,
“KeyType”: “RANGE”
}
],
“LocalSecondaryIndexes”: [
{
“IndexName”: “LastPostIndex”,
“KeySchema”: [
{
“AttributeName”: “ForumName”,
“KeyType”: “HASH”
},
{
“AttributeName”: “LastPostDateTime”,
“KeyType”: “RANGE”
}
],
“Projection”: {
“ProjectionType”: “KEYS_ONLY”
}
}
],
“ProvisionedThroughput”: {
“ReadCapacityUnits”: 5,
“WriteCapacityUnits”: 5
}
}

返回值如下:

{
“TableDescription”: {
“TableArn”: “arn:aws:dynamodb:us-west-2:123456789012:table/Thread”,
“AttributeDefinitions”: [
{
“AttributeName”: “ForumName”,
“AttributeType”: “S”
},
{
“AttributeName”: “LastPostDateTime”,
“AttributeType”: “S”
},
{
“AttributeName”: “Subject”,
“AttributeType”: “S”
}
],
“CreationDateTime”: 1.36372808007E9,
“ItemCount”: 0,
“KeySchema”: [
{
“AttributeName”: “ForumName”,
“KeyType”: “HASH”
},
{
“AttributeName”: “Subject”,
“KeyType”: “RANGE”
}
],
“LocalSecondaryIndexes”: [
{
“IndexArn”: “arn:aws:dynamodb:us-west-2:123456789012:table/Thread/index/LastPostIndex”,
“IndexName”: “LastPostIndex”,
“IndexSizeBytes”: 0,
“ItemCount”: 0,
“KeySchema”: [
{
“AttributeName”: “ForumName”,
“KeyType”: “HASH”
},
{
“AttributeName”: “LastPostDateTime”,
“KeyType”: “RANGE”
}
],
“Projection”: {
“ProjectionType”: “KEYS_ONLY”
}
}
],
“ProvisionedThroughput”: {
“NumberOfDecreasesToday”: 0,
“ReadCapacityUnits”: 5,
“WriteCapacityUnits”: 5
},
“TableName”: “Thread”,
“TableSizeBytes”: 0,
“TableStatus”: “CREATING”
}
}

https://blog.csdn.net/vikings_1001/article/details/48434689

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章