Tôi nghĩ đây là một câu hỏi thực sự hay, nhưng các câu trả lời sẽ hơi phân tán dựa trên các lib bạn đang sử dụng và kỳ vọng của bạn về một cuộc "di cư".
Hãy cùng xem một số hành động di chuyển phổ biến:
- Thêm trường: Mongo làm cho điều này rất dễ dàng. Chỉ cần thêm một trường là bạn đã hoàn tất.
- Xóa trường: Về lý thuyết, bạn không thực sự bị ràng buộc với lược đồ của mình, vì vậy "xóa" ở đây là tương đối. Nếu bạn xóa "thuộc tính" và không tải trường nữa, thì việc trường đó có trong dữ liệu không thực sự quan trọng. Vì vậy, nếu bạn không quan tâm đến việc "dọn dẹp" cơ sở dữ liệu, sau đó xóa một trường 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 for khổng lồ chống lại DB.
- Sửa đổi tên trường: Đây cũng là một bài toán khó. Khi bạn đổi tên một trường "ở đâu" bạn đang đổ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 for khổng lồ trên DB. Để an toàn, bạn có thể phải "thêm" dữ liệu, sau đó đẩy mã, sau đó "hủy đặt" trường cũ.
Một số nếp nhăn
Tuy nhiên, khái niệm tên trường song song với đối tượng ActiveRecord chỉ hơi sai lệch một chút. Một đối tượng ActiveRecord đang cung cấp một cách hiệu quả các ánh xạ của các thuộc tính đối tượng đến các trường cơ sở dữ liệu thực tế.
Trong một RDBMS điển hình, "kích thước" của tên trường không thực sự phù hợp. Tuy nhiên, trong Mongo, tên trường thực sự chiếm không gian dữ liệu và điều này tạo ra sự khác biệt lớn về mặt 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 lại cố gắng 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ẽ là những thứ có thể đọc được như "Tên", "Giá", "Số lượng".
Lý do tôi đưa ra điều này là nó thêm một nếp nhăn khác để Sửa đổi tên trường . Nếu bạn đang triển khai ánh xạ thì việc sửa đổi tên trường không thực sự gây ra sự di chuyển.
Một số nếp nhăn khác
Nếu bạn làm muốn thực hiện di chuyển khi xóa, thì 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 tiết kiệm 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 dung lượng và nó không thực sự "trả lại" trừ khi bạn thực hiệ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 tài liệu được di chuyển sau đó, thì bạn có thể lấy lại dung lượng, tuy nhiên, tài liệu chỉ di chuyển khi chúng lớn lên.
Nếu 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 tại chỗ mới compact
lệnh.