2011-09-27 17 views
60

Ba loại cơ sở dữ liệu NoSQL mà tôi đã đọc là khóa-giá trị, định hướng cột và định hướng tài liệu.NoSQL theo định hướng cột khác với hướng tài liệu như thế nào?

Khóa-giá trị khá thẳng về phía trước - khóa có giá trị đơn giản.

Tôi đã nhìn thấy cơ sở dữ liệu định hướng tài liệu được mô tả giống như khóa-giá trị, nhưng giá trị có thể là cấu trúc, như đối tượng JSON. Mỗi "tài liệu" có thể có tất cả, một số hoặc không có khóa nào giống với khóa khác.

Định hướng cột dường như rất giống với tài liệu được định hướng mà bạn không chỉ định cấu trúc.

Vậy sự khác nhau giữa hai yếu tố này là gì và tại sao bạn nên sử dụng cái kia?

Tôi đã xem xét MongoDB và Cassandra một cách cụ thể. Về cơ bản tôi cần một cấu trúc động có thể thay đổi, nhưng không ảnh hưởng đến các giá trị khác. Đồng thời, tôi cần có khả năng tìm kiếm/lọc các khóa cụ thể và chạy báo cáo. Với CAP, AP là quan trọng nhất đối với tôi. Dữ liệu có thể "cuối cùng" được đồng bộ hóa qua các nút, miễn là không có xung đột hoặc mất dữ liệu. Mỗi người dùng sẽ có "bảng" riêng của họ.

Trả lời

26

Trong Cassandra, mỗi hàng (được giải quyết bằng khóa) chứa một hoặc nhiều "cột". Các cột là các cặp khóa-giá trị. Tên cột không cần phải được xác định trước, tức là cấu trúc không cố định. Các cột liên tiếp được lưu trữ theo thứ tự sắp xếp theo các khóa (tên) của chúng.

Trong một số trường hợp, bạn có thể có số lượng cột rất lớn trong một hàng (ví dụ: hoạt động như một chỉ mục để bật các loại truy vấn cụ thể). Cassandra có thể xử lý các cấu trúc lớn như vậy một cách hiệu quả, và bạn có thể lấy các dãy cột cụ thể.

Có cấp độ cấu trúc cao hơn (không thường được sử dụng) được gọi là siêu cột, trong đó cột chứa các cột lồng nhau (phụ).

Bạn có thể nghĩ về cấu trúc tổng thể như một hashtable lồng nhau/từ điển, với 2 hoặc 3 mức khóa.

gia đình cột bình thường:

row 
    col col col ... 
    val val val ... 

Siêu gia đình cột:

row 
     supercol      supercol      ... 
      (sub)col (sub)col ...  (sub)col (sub)col ... 
      val  val  ...  val  val  ... 

Ngoài ra còn có các cấu trúc cấp cao - gia đình cột và keyspaces - có thể được sử dụng để phân chia hoặc nhóm lại với nhau dữ liệu của bạn.

cũng xem Câu hỏi này: Cassandra: What is a subcolumn

Hoặc mô hình dữ liệu liên kết từ http://wiki.apache.org/cassandra/ArticlesAndPresentations

Re: so sánh với cơ sở dữ liệu tài liệu theo định hướng - sau này thường chèn toàn bộ tài liệu (thường là JSON), trong khi ở Cassandra bạn có thể địa chỉ các cột hoặc siêu cột riêng lẻ và cập nhật các cột riêng lẻ này, tức là chúng hoạt động ở mức độ chi tiết khác nhau. Mỗi cột có dấu thời gian/phiên bản riêng (được sử dụng để điều chỉnh các bản cập nhật trên cụm được phân phối).

Giá trị cột Cassandra chỉ là byte, nhưng có thể được nhập dưới dạng văn bản ASCII, UTF8, số, ngày, v.v.

Tất nhiên, bạn có thể sử dụng Cassandra làm kho lưu trữ tài liệu nguyên thủy bằng cách chèn các cột chứa JSON - nhưng bạn sẽ không nhận được tất cả các tính năng của một kho lưu trữ tài liệu thực.

+0

Vì vậy, có định hướng cột như bảng cơ sở dữ liệu quan hệ, nhưng lật qua và không có yêu cầu lược đồ? Nếu tôi so sánh các thuật ngữ Cassandra với các thuật ngữ MySQL, tôi sẽ làm như thế nào? Là một bảng giống như một cột gia đình hoặc một keyspace? Với định hướng tài liệu, bạn có nói rằng bạn không thể cập nhật các khóa riêng lẻ trong tài liệu không? Có vẻ như Casandra có thể có cấu trúc phụ. MongoDB và những người khác thích nó có chức năng này không? – Luke

+3

Một họ cột giống như một cái bàn. Một hàng giống như một hàng của bảng. Các cột giống như cột cơ sở dữ liệu, ngoại trừ việc chúng có thể được xác định khi đang di chuyển, vì vậy bạn có thể có một bảng rất thưa thớt trong một số trường hợp hoặc bạn có thể có các cột khác nhau được điền trong mỗi hàng. – DNA

+1

Nó phụ thuộc vào cơ sở dữ liệu. Trong MongoDB (hướng tài liệu) bạn cũng có thể cập nhật mọi khóa đơn. –

18

Trong "chèn", để sử dụng các từ rdbms, Dựa trên tài liệu phù hợp hơn và thẳng hơn. Lưu ý hơn cassandra cho phép bạn đạt được sự nhất quán với khái niệm số đại biểu, nhưng điều đó sẽ không áp dụng cho tất cả các hệ thống dựa trên cột và làm giảm tính sẵn sàng. Trên một hệ thống viết một lần/thường xuyên nặng, hãy vào MongoDB. Cũng nên xem xét nó nếu bạn luôn có kế hoạch đọc toàn bộ cấu trúc của đối tượng. Một hệ thống dựa trên tài liệu được thiết kế để trả lại toàn bộ tài liệu khi bạn nhận được nó, và không phải là rất mạnh khi trả lại các phần của toàn bộ hàng.

Các hệ thống dựa trên cột như Cassandra là cách tốt hơn so với tài liệu dựa trên "cập nhật". Bạn có thể thay đổi giá trị của một cột mà không cần đọc hàng có chứa nó. Việc ghi không thực sự cần phải được thực hiện trên cùng một máy chủ, một hàng có thể được chứa trên nhiều tệp của nhiều máy chủ. Trên hệ thống dữ liệu phát triển nhanh, hãy đi tìm Cassandra. Ngoài ra, hãy xem xét nếu bạn dự định có một lượng dữ liệu rất lớn trên mỗi khóa và sẽ không cần phải tải tất cả chúng ở mỗi truy vấn. Trong "chọn", Cassandra cho phép bạn tải chỉ cột bạn cần. Cũng xem xét rằng Mongo DB được viết bằng C++, và có bản phát hành chính thứ hai, trong khi Cassandra cần chạy trên JVM, và bản phát hành chính đầu tiên của nó chỉ được phát hành từ ngày hôm qua (nhưng phiên bản 0.X biến thành sản phẩm của công ty lớn rồi).

Mặt khác, thiết kế của Cassandra một phần dựa trên Amazon Dynamo, và nó được xây dựng ở cốt lõi của nó để trở thành một giải pháp khả dụng cao, nhưng điều đó không liên quan gì đến định dạng dựa trên cột. MongoDB cũng quy mô, nhưng không duyên dáng như Cassandra.

33

Sự khác biệt chính là lưu trữ tài liệu (ví dụ: MongoDB và CouchDB) cho phép các tài liệu phức tạp tùy ý, nghĩa là các tài liệu phụ trong các tài liệu phụ, danh sách có tài liệu, v.v. trong khi các cửa hàng cột (ví dụ: Cassandra và HBase) chỉ cho phép định dạng cố định, ví dụ: các từ điển một cấp hoặc hai cấp nghiêm ngặt.

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