2009-12-25 39 views
16

Tôi đang tìm cách tự động hóa việc di chuyển lược đồ cho các cơ sở dữ liệu như MongoDB hoặc CouchDB.Có công cụ nào để di chuyển lược đồ cho cơ sở dữ liệu NoSQL không?

Tốt hơn, bản tin này nên được viết bằng python, nhưng bất kỳ ngôn ngữ nào khác đều được chấp nhận.

+0

Câu hỏi đặt ra là làm thế nào một giả lập tính năng quan hệ trong NoSQL? Ví dụ, cách đúng đắn để thực hiện quan hệ nhiều-nhiều trong lưu trữ khóa-giá trị là gì? Hoặc hạn chế? Chào mừng bạn đến với SO, BTW :-) – sastanin

+0

No. Tôi có nghĩa là di chuyển lược đồ. Cách di chuyển từ phiên bản tài liệu này sang phiên bản tài liệu khác (đổi tên trường, v.v.). –

Trả lời

9

Vì cơ sở dữ liệu nosql có thể chứa một lượng lớn dữ liệu bạn không thể di chuyển nó trong hàng rào rdbms thông thường. Trên thực tế bạn không thể làm điều đó cho rdbms cũng như ngay sau khi dữ liệu của bạn vượt qua một số ngưỡng kích thước. Không thể đưa trang web của bạn xuống trong một ngày để thêm trường vào bảng hiện có và do đó, với rdbms, bạn sẽ làm các bản vá xấu xí như thêm bảng mới chỉ cho trường và thực hiện kết nối để truy cập dữ liệu. Trong thế giới nosql bạn có thể làm vài việc.

  • Vì những người khác đề xuất bạn có thể viết mã của mình để mã sẽ xử lý các 'phiên bản' khác nhau của lược đồ có thể. điều này thường đơn giản hơn. Nhiều loại thay đổi lược đồ là tầm thường để mã hóa xung quanh. ví dụ nếu bạn muốn thêm một trường mới vào lược đồ, bạn chỉ cần thêm nó vào tất cả các bản ghi mới và nó sẽ trống trên tất cả các bản ghi cũ (bạn sẽ không nhận được "trường không tồn tại" lỗi hoặc bất cứ điều gì;). nếu bạn cần một giá trị 'mặc định' cho trường trong bản ghi cũ thì nó quá nhỏ trong mã.
  • Tùy chọn khác và thực sự là tùy chọn lành mạnh tiếp theo với thay đổi giản đồ không tầm thường như đổi tên trường và thay đổi cấu trúc là lưu trữ schema_version trong MACHI bản ghi và có mã để di chuyển dữ liệu từ phiên bản này sang phiên bản tiếp theo trên ĐỌC . tức là nếu phiên bản lược đồ hiện tại của bạn là 10 và bạn đã đọc bản ghi từ cơ sở dữ liệu với phiên bản 7, thì lớp db của bạn sẽ gọi migrate_8, migrate_9 và migrate_10. Bằng cách này, dữ liệu được truy cập sẽ dần được di chuyển sang phiên bản mới. và nếu nó không được truy cập, thì ai quan tâm là phiên bản nào;)
3

Một trong những lợi ích được cho là của các cơ sở dữ liệu này là chúng là schemaless, và do đó không cần các công cụ di chuyển lược đồ. Thay vào đó, bạn viết mã xử lý dữ liệu của mình để xử lý nhiều loại dữ liệu được lưu trữ trong db.

+4

Thật khó để viết mã để xử lý tất cả các phiên bản của tài liệu. Mã phát triển và cơ sở dữ liệu cũng nên tiến hóa. Cơ sở dữ liệu như vậy không phải là sơ đồ, chúng là lược đồ miễn phí. Và điều này có nghĩa là bạn có thể có một số cấu trúc tài liệu nhưng không có giới hạn mạnh. –

+2

Tôi nghĩ rằng đối với các cơ sở dữ liệu NoSQL, chúng tôi phải có các công cụ "di chuyển dữ liệu", thay vì đó là các công cụ "di chuyển lược đồ". Nếu không có, thì tôi sẽ tự viết một bản. –

+0

Tôi không chắc chắn về sự khác biệt giữa "schemaless" và "schema free". Trong mọi trường hợp, một ưu điểm của các cơ sở dữ liệu này là bạn không phải cập nhật tất cả dữ liệu khi lược đồ thay đổi. Bạn có thể, ví dụ, cập nhật mỗi bản ghi/tài liệu khi nó được đọc và phát hiện ở định dạng cũ. Nếu bạn không tìm thấy bất kỳ công cụ nào làm những gì bạn muốn, bạn có thể đam mê một đường mòn mới hoặc không hiểu văn hóa NoSQL. –

2

Nếu dữ liệu của bạn đủ lớn, có thể bạn sẽ thấy rằng bạn không thể EVER di chuyển dữ liệu hoặc không có lợi như vậy. Điều này có nghĩa là khi bạn thực hiện thay đổi lược đồ, mã cần tiếp tục tương thích ngược với các định dạng cũ mãi mãi.

Tất nhiên nếu dữ liệu của bạn "tuổi" và cuối cùng hết hạn, điều này có thể làm di chuyển giản đồ cho bạn - chỉ cần thay đổi định dạng cho dữ liệu mới được thêm, sau đó đợi tất cả dữ liệu ở định dạng cũ hết hạn - bạn có thể nghỉ hưu mã tương thích ngược.

+0

Hm, điều này có ý nghĩa. Nhưng câu hỏi là về các công cụ đã sẵn sàng, điều này cũng sẽ giúp tôi cập nhật phiên bản tài liệu của mình. –

1

Khi dự án có nhu cầu di chuyển lược đồ liên quan đến cơ sở dữ liệu NoSQL khiến tôi nghĩ rằng bạn vẫn đang suy nghĩ trong cơ sở dữ liệu quan hệ nhưng sử dụng cơ sở dữ liệu NoSQL.

Nếu có ai đó bắt đầu làm việc với cơ sở dữ liệu NoSQL, bạn cần nhận ra rằng hầu hết các 'quy tắc' cho RDBMS (tức là MySQL) cũng cần phải đi ra ngoài cửa sổ. Những thứ như lược đồ nghiêm ngặt, bình thường hóa, sử dụng nhiều mối quan hệ giữa các đối tượng. NoSQL tồn tại để giải quyết các vấn đề không cần tất cả các tính năng bổ sung được cung cấp bởi RDBMS.

Tôi mong bạn viết mã theo cách không mong đợi hoặc cần lược đồ cứng cho cơ sở dữ liệu NoSQL của bạn - bạn nên hỗ trợ lược đồ cũ và chuyển đổi bản ghi tài liệu khi bạn truy cập nếu bạn thực sự muốn nhiều trường lược đồ hơn trên bản ghi đó.

Hãy ghi nhớ rằng NoSQL lưu trữ hoạt động tốt nhất khi bạn suy nghĩ và thiết kế khác nhau so với khi sử dụng một RDBMS

+0

Đây không phải là giải pháp. Cảm ơn bạn cho bạn "thú vị" IMHO. –

+1

Không, đây không phải là 'giải pháp' - cũng không phải là câu trả lời được chấp nhận vì nó về cơ bản là 'bạn không thể làm điều đó' nếu bạn nhìn vào các câu trả lời theo cùng một cách. Tất cả những gì tôi đang cố gắng làm là thu hút sự chú ý đến thực tế rằng người ta thực sự nên tự hỏi liệu họ có thực sự cần một lược đồ cứng trên cơ sở dữ liệu NoSQL hay không. Các lược đồ có thể gây ra các vấn đề ở quy mô, đó là một lý do mà NoSQL là một giải pháp mở rộng tốt, chúng không có các lược đồ cứng. –

+0

Thực tế là bạn sử dụng cơ sở dữ liệu NoSQL không có nghĩa là bạn phải quên các thực hành tốt được học bằng cách sử dụng RDBMS trong hai thập kỷ. Ngược lại, có nhiều công cụ để cung cấp xác nhận lược đồ cấp ứng dụng của dữ liệu. NoSQL thực hiện đặt cược tăng tốc độ bằng cách sử dụng chuẩn hóa đã được sử dụng trong RDBMS (và đó là một phần của cách NoSQL được phát minh), nó không có nghĩa là mọi thứ từ RDBMS phải được bỏ đi. Điều này phụ thuộc mạnh vào ứng dụng bạn đang phát triển. –

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