2012-02-07 25 views
17

Tôi đang cố gắng tìm đường với DynamoDB và NoSQL.Làm thế nào để mô hình Học sinh/Lớp học với DynamoDB (NoSQL)

Cách tiếp cận tốt nhất (phải?) Để lập mô hình bảng học sinh và các bảng lớp học liên quan đến thực tế là tôi cần có mối quan hệ học sinh-trong-lớp. Tôi tính đến việc không có chỉ mục thứ hai trong DynamoDB.

Mô hình cần trả lời các câu hỏi sau:

Học sinh nào thuộc một lớp học cụ thể?

Học sinh học lớp nào?

Cảm ơn

+0

Bài tập về nhà này phải không? Nếu vậy, hãy gắn thẻ như vậy (không cố gắng để có nghĩa là, nhưng chỉ cần kiểm tra). – Kiril

+5

Nó không phải là bài tập về nhà; Tôi đã cố gắng đưa ra câu hỏi mang tính xây dựng dễ nhất mà tôi có thể nghĩ đến sau khi dành một chút thời gian để hiểu mô hình NoSQL và phi quan hệ ... –

Trả lời

14

Đề xuất rất đơn giản (không có phím phạm vi) sẽ có hai bảng: Một cho mỗi loại truy vấn. Đây không phải là điều bất thường trong cơ sở dữ liệu NoSQL.

Trong trường hợp của bạn, chúng tôi muốn có:

  • Một bảng Student với thuộc tính StudentId như (loại hash) khóa chính. Mỗi mục có thể có một thuộc tính có tên là Attends, giá trị của nó là một danh sách các Id trên các lớp.
  • Bảng Class với thuộc tính ClassId làm khóa chính (loại băm). Mỗi mục có thể có một thuộc tính có tên là AttendedBy, giá trị trong số đó là danh sách các Id trên sinh viên.

Thực hiện truy vấn của bạn sẽ đơn giản. Cập nhật cơ sở dữ liệu với một "tham dự" - mối quan hệ giữa một học sinh và một lớp đòi hỏi phải có hai bài viết riêng biệt, một cho mỗi bảng.

Thiết kế khác sẽ có một bảng Attends với khóa chính băm và phạm vi chính. Mỗi hồ sơ sẽ đại diện cho sự tham dự của một học sinh vào một lớp. Thuộc tính hash có thể là Id của lớp và khóa phạm vi có thể là Id của sinh viên. Dữ liệu bổ sung về lớp học và học sinh sẽ cư trú trong các bảng khác, sau đó.

+0

Vì (theo hiểu biết của tôi), tôi bị giới hạn trong một khóa băm trong DynamoDB (không chỉ số cột) phải là tên người dùng và không phải là userId tùy ý vì tôi muốn nhận các lớp của học sinh trong khi cung cấp tên của mình cho "truy vấn" –

+0

Có, nếu bạn có tên người dùng duy nhất cho mỗi sinh viên, đó là mã nhận diện phù hợp để sử dụng . –

+0

Được coi là không chuẩn hóa? –

-1

Để tham gia hai bảng Amazon DynamoDB

Ví dụ sau đây ánh xạ hai bảng Hive vào dữ liệu được lưu trữ trong Amazon DynamoDB. Sau đó nó gọi một tham gia trên hai bảng đó. Phép nối được tính trên cụm và trả về. Việc tham gia không diễn ra trong Amazon DynamoDB. Ví dụ này trả về danh sách khách hàng và giao dịch mua của họ cho khách hàng đã đặt nhiều hơn hai đơn đặt hàng.

CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES ("dynamodb.table.name" = "Purchases", 
"dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); 

CREATE EXTERNAL TABLE hive_customers(customerId bigint, customerName string, customerAddress array<String>) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Customers", 
"dynamodb.column.mapping" = "customerId:CustomerId,customerName:Name,customerAddress:Address"); 

Select c.customerId, c.customerName, count(*) as count from hive_customers c 
JOIN hive_purchases p ON c.customerId=p.customerId 
GROUP BY c.customerId, c.customerName HAVING count > 2; 
+4

Đây không phải là DynamoDB và không trả lời câu hỏi về mô hình hóa dữ liệu – Tyrsius

Các vấn đề liên quan