2010-08-30 34 views

Trả lời

13

Tôi nghĩ rằng đây là một câu hỏi thực sự hay, nhưng câu trả lời sẽ có một chút phân tán dựa trên libs bạn đang sử dụng và kỳ vọng của bạn về "di cư".

Chúng ta hãy xem xét một số hành động di cư chung:

  • Thêm một lĩnh vực: Mongo làm cho điều này rất dễ dàng. Chỉ cần thêm một trường và bạn đã hoàn tất.
  • Xóa một trường: Về lý thuyết, bạn không thực sự gắn với lược đồ của bạn, do đó, "xóa" ở đây là tương đối. Nếu bạn xóa "thuộc tính" và không còn tải trường nữa, thì điều đó thực sự không quan trọng nếu trường đó nằm trong dữ liệu. Vì vậy, nếu bạn không quan tâm đến việc "dọn sạch" cơ sở dữ liệu, thì việc xóa trường sẽ không ảnh hưởng đến cơ sở dữ liệu. Nếu bạn làm quan tâm đến việc làm sạch DB, về cơ bản bạn sẽ cần chạy một vòng lặp khổng lồ đối với DB.
  • Sửa đổi tên trường: Đây cũng là một vấn đề khó khăn. Khi bạn đổi tên một trường "where" là bạn đổi tên nó? Nếu bạn muốn DB phản ánh tên trường mới, thì về cơ bản bạn phải thực thi một vòng lặp khổng lồ trên DB. Để được an toàn, bạn có thể phải "thêm" dữ liệu, sau đó đẩy mã, sau đó "bỏ đặt" trường cũ.

Một số Nếp nhăn

Tuy nhiên, khái niệm về một tên trường song song với một đối tượng ActiveRecord chỉ là một chút sai lệch. Một đối tượng ActiveRecord có hiệu quả cung cấp ánh xạ các thuộc tính đối tượng cho các trường cơ sở dữ liệu thực tế.

Trong RDBMS điển hình, "kích thước" của tên trường không thực sự có liên quan. Tuy nhiên, ở Mongo, tên trường thực sự chiếm không gian dữ liệu và điều này tạo nên sự khác biệt lớn về hiệu suất.

Bây giờ, nếu bạn đang sử dụng một số dạng "đối tượng dữ liệu" như ActiveRecord, tại sao bạn sẽ cố lưu trữ tên trường đầy đủ trong dữ liệu? DB có lẽ nên lưu trữ tất cả các trường theo thứ tự bảng chữ cái với một bản đồ ở phía đối tượng. Vì vậy, một tài liệu có thể có 8 trường/thuộc tính và tên DB sẽ là "a", "b" ... "j", nhưng tên đối tượng sẽ có thể đọc được như "Tên", "Giá", "Số lượng".

Lý do tôi làm điều này là thêm một nếp nhăn khác vào Sửa đổi tên trường. Nếu bạn đang thực hiện một ánh xạ thì việc sửa đổi một tên trường thực sự không gây ra sự di trú nào cả.

Một số chi tiết Nếp nhăn

Nếu bạn làm muốn thực hiện một di chuyển trên một xóa, sau đó bạn sẽ phải làm như vậy sau một triển khai. Bạn cũng sẽ phải nhận ra rằng bạn sẽ không lưu bất kỳ dung lượng đĩa hiện tại nào khi bạn làm như vậy.

Mongo phân bổ trước không gian và nó không thực sự "trả lại" trừ khi bạn sửa chữa DB. Vì vậy, nếu bạn xóa một loạt các trường trên tài liệu, các tài liệu đó vẫn chiếm cùng một không gian trên đĩa. Nếu các tài liệu sau đó được di chuyển, thì bạn có thể đòi lại không gian, tuy nhiên tài liệu chỉ di chuyển khi chúng phát triển.

Nếu bạn xóa một trường lớn khỏi nhiều tài liệu bạn sẽ muốn sửa chữa hoặc kiểm tra lệnh compact tại chỗ mới.

1

Không có dấu đầu dòng bạc. Việc thêm hoặc loại bỏ các trường dễ dàng hơn với db không quan hệ (chỉ cần không sử dụng các trường không cần thiết hoặc sử dụng các trường mới), đổi tên một trường dễ dàng hơn với db truyền thống (bạn sẽ thường phải thay đổi rất nhiều dữ liệu trong trường hợp đổi tên trường) trong db schemaless), việc di chuyển dữ liệu là ngang hàng - tùy thuộc vào nhiệm vụ.

+0

Tôi không nghĩ rằng đổi tên trường thậm chí còn tồn tại trên trang mongo mới nhất. –

1

Quy trình di chuyển trông như thế nào với một db không quan hệ?

Phụ thuộc vào nếu bạn cần cập nhật tất cả dữ liệu hiện có hay không.

Trong nhiều trường hợp, bạn có thể không cần chạm vào dữ liệu cũ, chẳng hạn như khi thêm trường tùy chọn mới. Nếu trường đó cũng có giá trị mặc định, bạn cũng có thể không cần cập nhật tài liệu cũ, nếu ứng dụng của bạn có thể xử lý trường bị thiếu chính xác. Tuy nhiên, nếu bạn muốn xây dựng chỉ mục trên trường mới để có thể tìm kiếm/lọc/sắp xếp, bạn cần phải thêm giá trị mặc định trở lại vào tài liệu cũ.

Thứ gì đó như đổi tên trường (tầm thường trong db quan hệ, vì bạn chỉ cần cập nhật danh mục và không chạm vào bất kỳ dữ liệu nào) là một cam kết chính trong MongoDB (bạn cần viết lại tất cả tài liệu).

Nếu bạn cần cập nhật dữ liệu hiện có, bạn thường phải viết hàm di chuyển lặp lại tất cả tài liệu và cập nhật từng tài liệu (mặc dù quá trình này có thể được chia sẻ và chạy song song). Đối với các tập dữ liệu lớn, điều này có thể mất rất nhiều thời gian (và không gian), và bạn có thể bỏ lỡ các giao dịch (nếu bạn kết thúc với một di chuyển bị rơi mà đi một nửa thông qua).

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