2011-01-23 43 views
19

Chỉ vì sự quan tâm mở rộng kiến ​​thức của tôi, tôi đã bắt đầu xem xét các tùy chọn NoSQL khác nhau. Người đầu tiên tôi ghé thăm là RavenDB và có vẻ thú vị. Tôi vẫn đang cố gắng phá vỡ suy nghĩ quan hệ sâu xa của mình, cùng với các thói quen bảo trì RDBMS điển hình.Thay đổi "lược đồ" trong RavenDB

Trong giao dịch hàng ngày với Entity Framework, chúng tôi thực hiện thường xuyên các thay đổi kịch bản DB, làm mới mô hình ánh xạ EF, vv Làm thế nào nó hoạt động trong công cụ NoSQL, đặc biệt là RavenDB? Khi một ứng dụng đã biến mất cuộc sống, làm thế nào để thay đổi các đối tượng POCO khác nhau, vv và triển khai nó vào sản xuất? Điều gì xảy ra với dữ liệu được lưu trữ trong các lớp POCO cũ?

Tôi chưa từng đào sâu hoặc sử dụng Raven DB tức giận. Điều này có thể rõ ràng một khi tôi làm nhưng rất thích biết trước khi tay vì vậy tôi không mã mình vào một góc.

Cảm ơn, D.

+0

Chắc chắn tôi đang thiếu một cái gì đó, nhưng IIRC là một cơ sở dữ liệu tài liệu * lược đồ * ít hơn, do đó, câu trả lời duy nhất là "không có gì xảy ra". Chúng vẫn tồn tại trong cùng một định dạng mà bạn đặt chúng * trong * in ...? –

+1

Rất tốt ... damn thật khó để tôi rời khỏi không gian quan hệ truyền thống! – codedog

+0

@codedog Tôi nghĩ ý tưởng không nhất thiết phải thoát khỏi không gian quan hệ truyền thống, nhưng để nhận ra rằng mỗi ý tưởng là một công cụ với một bộ mục tiêu khác nhau. Chúng tôi sử dụng cả cơ sở dữ liệu quan hệ và cơ sở dữ liệu NoSQL trong ứng dụng của chúng tôi. Bạn sẽ không xây dựng một ngôi nhà chỉ với một cái búa. Tương tự như vậy, bạn sẽ không xây dựng một ngôi nhà chỉ với một cái cưa. – Brain2000

Trả lời

27

Chúng sẽ ở lại vì họ là - tính chất không tồn tại nữa sẽ bị bỏ qua khi tải (và mất về biến đổi), và thiếu tính sẽ trở lại như null,

Đề nghị bạn sử dụng các hoạt động dựa trên thiết lập để giữ cho dữ liệu được kiểm tra với mô hình đối tượng.

Ồ, hãy nhìn vào tôi, tôi hiện đang sử dụng máy tính!

Về cơ bản, khi di chuyển đến cửa hàng tài liệu, bạn nhận ra rằng bạn mất một số chức năng và có được tự do trong cơ sở dữ liệu mà bạn đã xác định trước và cố gắng tải lên dữ liệu t khớp với lược đồ đó sẽ dẫn đến lỗi. Tuy nhiên, điều quan trọng là phải nhận ra rằng có sự khác biệt giữa lược đồ ít hơn và ít cấu trúc hơn, trong đó tài liệu của bạn đều có cấu trúc riêng (cặp khóa/giá trị biểu thị tên thuộc tính và giá trị thuộc tính).

Điều này làm cho nó hữu ích cho toàn bộ hệ số viết mã và giữ dữ liệu của bạn tồn tại - nhưng khi dễ dàng thay đổi cấu trúc mã, bạn có thể khó điều chỉnh hơn với dữ liệu.

Một vài chiến lược thể hiện mình tại thời điểm này:

  • Hãy cấu trúc của bạn không thể thay đổi một khi bạn đã được duy trì dữ liệu, phiên bản lớp học của bạn
  • Cho phép thay đổi cấu trúc, nhưng sử dụng các hoạt động thiết lập dựa trên để cập nhật dữ liệu vào phù hợp với cấu trúc mới
  • cho phép thay đổi cấu trúc, và viết mã để đối phó với mâu thuẫn khi tải dữ liệu

thứ ba là rõ ràng Nếu bạn chỉ lưu trữ các sự kiện hoặc các dữ liệu như vậy nhưng không thực sự thích hợp cho hầu hết các kịch bản, vì vậy bạn sẽ có tùy chọn ở giữa.

Tôi khuyên bạn nên thực hiện điều đó và tuân theo một vài quy tắc đơn giản dọc theo các dòng giống như bạn thực hiện khi xử lý lược đồ trên mặt trước trong cơ sở dữ liệu quan hệ.

  • Sử dụng hệ thống VCS của bạn để xác định những thay đổi giữa các phiên bản được triển khai
  • Viết kịch bản di cư mà nâng cấp từ một phiên bản khác
  • Hãy cẩn thận của đặt lại tên/loại bỏ bất động sản - như tải một tài liệu và lưu tài liệu sẽ cho kết quả trong dữ liệu bị mất nếu những tài sản không tồn tại trên tài liệu mới

vv

tôi hy vọng điều này là hữu ích hơn :-)

+1

Tôi muốn đưa ra một câu trả lời đầy đủ hơn, nhưng sáng trên điện thoại –

+1

Rất thích câu trả lời đầy đủ hơn, nhưng tôi đoán tất cả các bạn đã nói gì trước khi tóm tắt toàn bộ vấn đề. Tôi chỉ cố gắng tưởng tượng những gì nó sẽ giống như để duy trì một trang web chạy nhúng RavenDB. Tôi có một trang MVC 3 trong các tác phẩm, hiện đang sử dụng EF4. Rất cám dỗ để trích xuất DAL và thay thế nó bằng RavenDB! – codedog

+0

Hãy xem xét nó thực hiện –

3

RavenDB tuần tự hóa các đối tượng .NET của bạn thành định dạng JSON. Không có lược đồ.

Nếu bạn thêm một số đối tượng vào cơ sở dữ liệu của mình, chúng sẽ được đăng theo thứ tự. Nếu bạn thêm một số thuộc tính vào loại bạn đang tuần tự hóa, các đối tượng bạn đã lưu trữ sẽ bị thiếu các thuộc tính đó.

2

Bạn không quá nhiều không có quản lý lược đồ khi di chuyển nó vào mã của bạn để không bao giờ có sự không khớp giữa các đối tượng trong mã của bạn và các đối tượng trong cơ sở dữ liệu của bạn. Phần đầu tiên của việc xử lý thay đổi là đảm bảo rằng bạn sử dụng bộ nối tiếp có thể xử lý các giá trị bị thiếu/thừa - nếu một trường không được xác định trong dữ liệu, hãy đặt nó thành rỗng. Nếu một trường trong dữ liệu không khớp với thuộc tính trên đối tượng của bạn, hãy bỏ qua nó.

Hầu hết các thay đổi có thể được xử lý mà không cần nhiều hơn thế - hoặc có trường mới và bạn cần có giá trị mặc định cho các bản ghi hiện có hoặc có trường cũ mà bạn không quan tâm nữa. Để thay đổi phức tạp hơn, chẳng hạn như đổi tên/kết hợp các trường hoặc thay đổi định dạng dữ liệu, hãy thêm một trường mới vào đối tượng của bạn mà không xóa các mục cũ và có dữ liệu truyền tải phương thức của bạn từ các trường cũ. Khi bạn lưu bản ghi, nó sẽ ở định dạng mới. Mã này có thể được để ở vị trí vĩnh viễn, cập nhật dữ liệu khi cần hoặc bạn có thể thiết lập quy trình một lần để gọi cùng một mã cho tất cả các đối tượng hiện có. Lưu ý rằng không giống như tập lệnh sql, không cần thời gian ngừng hoạt động cho loại cập nhật này ngay cả khi phải mất một thời gian dài để chạy trên tập dữ liệu lớn, vì mã có thể xử lý cả định dạng cũ và mới.

+0

Bạn sử dụng cụm từ "... để đảm bảo rằng bạn sử dụng bộ nối tiếp ...". Tôi giả định lời khuyên của bạn không phải là cụ thể cho RavenDB? Trong sự hiểu biết hạn chế của tôi về RavenDB tôi nghĩ rằng nó có một serialiser dựng sẵn, tức là không phải cái gì tôi phải xử lý bản thân mình. Điều đó có đúng không? – codedog

+0

Vâng, đó là lưu trữ tài liệu/đối tượng NoSQL chung - tôi chủ yếu sử dụng JSON trong Redis. Với Raven bạn có thể chỉ định một serializer tùy chỉnh nếu bạn cần, nhưng tiêu chuẩn cho phép bạn thiết lập các trường bắt buộc/tùy chọn/bỏ qua bằng cách sử dụng các thuộc tính. –

3

Bài viết này bởi Ayende mô tả làm thế nào để thực hiện một sự chuyển đổi từ 1 tới phiên bản 2 (trong trường hợp này thay đổi một "Tên" tài sản để "FirstName" và "LastName" tài sản.

http://ayende.com/blog/66563/ravendb-migrations-rolling-updates

Về cơ bản một nghe được đăng ký trong DocumentStore:

documentStore.RegisterListener(new CustomerVersion1ToVersion2Converter()) 

mẫu impementation lấy từ bài báo đề cập ở trên:

public class CustomerVersion1ToVersion2Converter : IDocumentConversionListener 
{ 
    public void EntityToDocument(object entity, RavenJObject document, RavenJObject metadata) 
    { 
     Customer c = entity as Customer; 
     if (c == null) 
      return; 

     metadata["Customer-Schema-Version"] = 2; 
     // preserve the old Name property, for now. 
     document["Name"] = c.FirstName + " " + c.LastName; 
     document["Email"] = c.CustomerEmail; 
    } 

    public void DocumentToEntity(object entity, RavenJObject document, RavenJObject metadata) 
    { 
     Customer c = entity as Customer; 
     if (c == null) 
      return; 
     if (metadata.Value<int>("Customer-Schema-Version") >= 2) 
      return; 

     c.FirstName = document.Value<string>("Name").Split().First(); 
     c.LastName = document.Value<string>("Name").Split().Last(); 
     c.CustomerEmail = document.Value<string>("Email"); 
    } 
} 
Các vấn đề liên quan