2016-05-06 41 views
17

私はdynamodbを初めて使用しています。私はdynamodbでputitemを使用すると自動的にid値をインクリメントしたいです。dynamodbでプライマリキーidにauto incrementを使用する方法

これは可能ですか?

+0

可能な重複でのInstagramのシャーディングIDの生成に触発されたタイムスタンプ+ランダムを使用している[DynamoDBの中にUUIDを作成するには?](http://stackoverflow.com/questions/11721308/how-to-make-a-uuid-in-dynamodb) – Clarkie

+0

またはこれ1つhttp://stackoverflow.com/questions/13264236/dynamodb-auto-incremented-id-server-time-ios-sdk – Clarkie

答えて

18

DynamoDBでは、これをそのまま使用することはできません。ほとんどのシステムでは一意でなければならないUUIDなど、アプリケーション内に何かを生成することができます。

あなたがNode.jsを使用していることに気付きました(あなたのタグを削除しました)。 README

var uuid = require('node-uuid'); 
var uuid1 = uuid.v1(); 
var uuid2 = uuid.v1({node:[0x01,0x23,0x45,0x67,0x89,0xab]}); 
var uuid3 = uuid.v1({node:[0, 0, 0, 0, 0, 0]}) 
var uuid4 = uuid.v4(); 
var uuid5 = uuid.v4(); 
+0

FWIW私はDynamoでこのアプローチ(ハッシュキーとしてUUID)を使用しました。 – rpmartz

+1

この回答は正解とマークする必要があります。また、キーを一様に配布する必要があり、自動インクリメントが不均一な分布につながるのはなぜですか?詳細については、次の記事を参照してください。https://forums.aws.amazon.com/thread.jspa?messageID=312527こちらのAWSドキュメント:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ BestPractices.html –

8

これは全体の多くのパーティション/破片/サーバをスケールするために構築されてDynamoDBの中にアンチパターンであるからnode-uuid

例:ここではUUID機能を提供するライブラリです。 DynamoDBはスケーリングの制限により自動インクリメントの主キーをサポートしておらず、複数のサーバーにわたって保証されていません。

複数のインデックスからプライマリキーをアセンブルする方がよいでしょう。主キーは2048バイトまで可能です。いくつかのオプションがあります:

  1. 使用あなたの鍵としてUUID - 均等に分布し、それがユニークなのと(時刻値におそらくビットシフトをランダムに生成された番号またはタイムスタンプ+ランダムに
  2. 使用を運ぶ可能性が時間ベースのUUID )のような:< < 12 TS + RANDOM_NUMBER
  3. )余分な呼び出しを必要とする(インクリメンタルユニークなIDを生成するために、他のサービスやDynamoDBの自分自身を使用し

コードが自動になるに従い増分カウンタを使用して、主キーとして使用できます。

var documentClient = new AWS.DynamoDB.DocumentClient(); 
var params = { 
    TableName: 'sampletable', 
    Key: { HashKey : 'counters' }, 
    UpdateExpression: 'ADD #a :x', 
    ExpressionAttributeNames: {'#a' : "counter_field"}, 
    ExpressionAttributeValues: {':x' : 1}, 
    ReturnValues: "UPDATED_NEW" // ensures you get value back 
}; 
documentClient.update(params, function(err, data) {}); 
// once you get new value, use it as your primary key 

私の個人的な好みはのhttp://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram

var EPOCH = 1300000000000; 
function generateRowId(subid) { 
    var ts = new Date().getTime() - EPOCH; // limit to recent 
    var randid = Math.floor(Math.random() * 512); 
    ts = (ts * 64); // bit-shift << 6 
    ts = ts + subid); 
    return (ts * 512) + (randid % 512); 
} 
var newPrimaryHashKey = "obj_name:" + generateRowId(4); 
+0

2番目のポイントと最後のコードの詳細を追加できますか? 'subId'はシャードIDなのでしょうか? – andrhamm

関連する問題