2012-01-24 33 views
28

Có thể nhận DynamoDB tự động tạo ID duy nhất khi thêm các mục mới vào bảng không?UUID cho DynamoDB?

Tôi nhận thấy các đề xuất API Java @DynamoDBAutoGeneratedKey vì vậy tôi giả định có cách để làm việc này với PHP.

Nếu có, mã ứng dụng có tạo ra các ID này hoặc được thực hiện ở phía DynamoDB không?

Trả lời

19

Câu hỏi hay - trong khi khái niệm có thể, điều này dường như hiện không khả dụng dưới dạng tính năng cấp API DynamoDB, không phải CreateTable cũng không phải PutItem đề cập đến chức năng như vậy.

Các @DynamoDBAutoGeneratedKey ký hiệu bạn đã nhận thấy là một Java annotation, tức là đường cú pháp được cung cấp bởi Java SDK thực:

Một chú thích, trong Java ngôn ngữ lập trình máy tính, là một hình thức đặc biệt của siêu dữ liệu cú pháp mà có thể được thêm vào mã nguồn Java.

Như vậy @DynamoDBAutoGeneratedKey là một trong những Amazon DynamoDB Chú thích cung cấp như là một phần của Object Persistence Mẫu trong cao cấp API Java SDK (xem Using the Object Persistence Model with Amazon DynamoDB):

Đánh dấu một băm thuộc tính khóa hoặc phạm vi được tự động tạo. Mô hình Persistence Object sẽ tạo ra một UUID ngẫu nhiên khi lưu các thuộc tính này. Chỉ các thuộc tính Chuỗi có thể được đánh dấu là các khóa được tạo tự động.

+1

Cảm ơn Tôi không quen thuộc với Java vì vậy câu trả lời của bạn là thực sự hữu ích. Vì vậy, @DynamoDBAutoGeneratedKey chỉ đơn giản là nhận được Java API để tạo ra một UUID, không phải Dynamo chính nó phải không? Nó sẽ thực sự tuyệt vời nếu Dynamo có kiểu thuộc tính UUID sẽ tạo ra các ID ở bên cạnh chúng và trả lại chúng khi thêm các mục mới. – Adam

+1

@Adam: Thật vậy, '@ DynamoDBAutoGeneratedKey' chỉ đơn giản là chú thích tùy chỉnh do Java SDK cung cấp, tạo mã được tạo tại thời gian biên dịch và được thực thi trong ứng dụng Java để tạo UUID khi chạy - điều này không liên quan gì đến DynamoDB như vậy. Và tôi đồng ý, một kiểu dữ liệu DynamoDB UUID gốc sẽ khá thuận tiện - hãy hy vọng nhóm AWS sẽ mở rộng chức năng DynamoDB theo thời gian, chúng nổi tiếng để đáp ứng nhu cầu của khách hàng và đổi mới cho phù hợp! –

-4

Cách tiếp cận tôi đang sử dụng là sử dụng dấu thời gian hiện tại cho khóa băm (hoặc phím phạm vi, nếu sử dụng một khóa-dải quá). Lưu dấu thời gian dưới dạng số nguyên, biểu thị số mili giây kể từ khi bắt đầu "kỷ nguyên UNIX" (theo múi giờ UTC). Nhiều thư viện ngày/giờ có thể tạo số này cho bạn.

Điều này có lợi thế là nếu bạn muốn có trường "thời gian tạo" trong bảng, UUID của bạn đã lưu trữ thông tin này. Chỉ cần gọi một phương thức khác trong thư viện ngày/giờ của bạn để chuyển đổi dấu thời gian thành định dạng có thể đọc được.

(Hãy đảm bảo xử lý ngoại lệ sẽ xảy ra nếu mục thứ hai được tạo trong cùng một bảng có cùng dấu thời gian mili giây; chỉ cần quay lại và thử lại thao tác trong trường hợp đó, với dấu thời gian hiện tại sau đó.)

Ví dụ:

User table 

chỉ băm-key: userID (timestamp của việc tạo ra các thành viên này).

WidgetAttributes table 

khóa băm cộng với phạm vi-khóa.
khóa băm: userID (sử dụng userID từ bảng Người dùng của người dùng mà tiện ích con thuộc). phạm vi khóa: attribID (sử dụng dấu thời gian của việc tạo thuộc tính widget này).

Bây giờ bạn có thể chạy các hoạt động "truy vấn" trên bảng WidgetAttributes để nhận tất cả thuộc tính tiện ích con cho một người dùng nhất định; bằng cách sử dụng "lớn hơn 0" làm thông số truy vấn cho khóa phạm vi.

+7

dấu thời gian không được đảm bảo là duy nhất, đặc biệt nếu nhiều khách hàng đang chạy song song. – Jason

+0

timestamp_userID? – shle2821

+3

@ shle2821 Sẽ tốt hơn nếu chỉ tạo UUID cho id và lưu dấu thời gian trong một trường riêng biệt so với đề xuất này. –

0

Trong khi làm việc với dynamodb trong javascript với nodejs. Tôi sử dụng mô-đun npm uuid để genrate phím duy nhất.

Ví dụ:

id = uuid.v1();

tham khảo: uuid npm

0

Bằng cách sử dụng giản đồ dựa thư viện mapper dữ liệu AWS dynamodb trong Node.js, phím Hash (id) sẽ được tạo tự động. Các id được tạo tự động dựa trên uuid v4.

Để biết thêm chi tiết, hãy xem gói aws sau đây.

Data Mapper with annotation

Data Mapper package for Javascript

mẫu snipet

@table('my_table') 
class MyDomainClass { 
    @autoGeneratedHashKey() 
    id: string; 

    @rangeKey({defaultProvider:() => new Date()}) 
    createdAt: Date; 
}