2011-08-30 27 views
8

Làm cách nào để bạn quản lý thay đổi lược đồ chính khi bạn đang sử dụng một kho lưu trữ Nosql như SimpleDB?Làm cách nào để thực hiện thay đổi lược đồ trong hệ thống lưu trữ NOSQL

Tôi biết rằng tôi vẫn đang suy nghĩ về các thuật ngữ SQL, nhưng sau khi làm việc với SimpleDB trong một vài tuần, tôi cần thực hiện một thay đổi cho một cơ sở dữ liệu đang chạy. Tôi muốn thay đổi một trong các lớp đối tượng để có một id duy nhất, chứ không phải là tên doanh nghiệp, và vì nó được tham chiếu bởi một đối tượng khác, tôi sẽ cần cập nhật giá trị tham chiếu trong các đối tượng này.

Với cơ sở dữ liệu SQL, bạn sẽ chạy tập hợp các câu lệnh sql như là một phần của quy trình triển khai phần mềm máy khách. Rõ ràng điều này sẽ không hoạt động với một cái gì đó như SimpleDB như

  • không có tương đương với câu lệnh cập nhật SQL.
  • Do tính chất phân tán của SimpleDB, không có cách nào để biết khi nào các thay đổi bạn đã thực hiện cho cơ sở dữ liệu đã 'lọc' ra cho tất cả các nút đang chạy phần mềm máy khách của bạn.

Một số giải pháp tôi đã nghĩ đến là

  • Mỗi miền có một số phiên bản. Phần mềm máy khách biết phiên bản nào của miền mà nó nên sử dụng. Viết một số mã sao chép dữ liệu từ phiên bản miền này sang phiên bản tên miền khác, thực hiện mọi thay đổi cần thiết khi bạn thực hiện. Sau đó, bạn có thể cài đặt phần mềm máy khách mới, sau đó truy cập phiên bản miền mới. Cách tiếp cận này sẽ không hoạt động trừ khi bạn có thể 'đóng băng' tất cả quyền ghi trong quá trình cập nhật.

  • Mỗi mục có thuộc tính phiên bản cho biết định dạng được sử dụng khi được lưu trữ. Máy khách sử dụng thuộc tính này khi tải đối tượng vào bộ nhớ. Đối tượng sau đó có thể được chuyển đổi sang định dạng mới nhất khi nó được viết trở lại SimpleDB. Vấn đề với điều này là phần mềm mới cần phải được triển khai cho tất cả các máy chủ trước khi bất kỳ ghi ở định dạng mới xảy ra, hoặc khách hàng chạy phần mềm cũ sẽ không biết làm thế nào để đọc định dạng mới.

Tất cả là khá phức tạp và tôi tự hỏi liệu tôi có thiếu gì đó không?

Cảm ơn

Richard

Trả lời

4

Tôi sử dụng một cái gì đó tương tự như tùy chọn thứ hai của bạn, nhưng không có thuộc tính phiên bản.

Trước tiên, hãy cố gắng giữ cho các thay đổi của bạn thành những thứ dễ tương thích ngược - thay đổi khóa chính là trường hợp xấu nhất cho trường hợp này.

Xóa trường dễ dàng - chỉ cần dừng ghi vào trường đó khi tất cả các máy chủ đang chạy phiên bản không yêu cầu.

Thêm trường yêu cầu bạn không bao giờ viết đối tượng đó bằng mã sẽ không lưu trường đó. Nếu bạn không thể triển khai phiên bản mới ở mọi nơi cùng một lúc, hãy sử dụng phiên bản trung gian hỗ trợ lưu trường trước khi bạn triển khai phiên bản yêu cầu phiên bản đó.

Thay đổi trường chỉ là kết hợp của hai thao tác này.

Với những thay đổi về phương pháp tiếp cận này được áp dụng khi cần - viết bằng phiên bản mới, nhưng cho phép đọc phiên bản cũ với giá trị mặc định hoặc có nguồn gốc cho trường mới.

Bạn có thể sử dụng cùng một mã để cập nhật tất cả các bản ghi cùng một lúc, mặc dù điều này có thể không phù hợp trên tập dữ liệu lớn.

Thay đổi khóa chính có thể được xử lý theo cùng một cách, nhưng có thể thực sự phức tạp tùy thuộc vào hệ thống nosql bạn đang sử dụng. Có thể bạn đang mắc kẹt với việc thiết kế mã di chuyển tùy chỉnh trong trường hợp này.