NoSQL hướng cột khác với hướng tài liệu như thế nào?


89

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

Khóa-giá trị khá dễ hiểu - một khóa có giá trị đơn giản.

Tôi đã thấy cơ sở dữ liệu hướng tài liệu được mô tả giống như khóa-giá trị, nhưng giá trị có thể là một cấu trúc, như một đố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 định hướng tài liệu ở chỗ bạn không chỉ định cấu trúc.

Vậy sự khác biệt giữa hai cái này là gì, và tại sao bạn lại sử dụng cái này hơn cái kia?

Tôi đã đặc biệt xem xét MongoDB và Cassandra. 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ó thể 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 "cuối cùng" có thể được đồng bộ hóa giữa 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ẽ nhận được "bảng" của riêng họ.

Câu trả lời:


41

Trong Cassandra, mỗi hàng (được đánh địa chỉ bằng một khóa) chứa một hoặc nhiều "cột". Bản thân các cột là cặp khóa-giá trị. Tên cột không cần được xác định trước, tức là cấu trúc không cố định. Các cột trong một hàng được lưu trữ theo thứ tự được 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 để kích hoạ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ể truy xuất các dải cột cụ thể.

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

Bạn có thể coi cấu trúc tổng thể như một bảng băm / từ điển lồng nhau, với 2 hoặc 3 cấp độ khóa.

Họ cột bình thường:

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

Họ siêu 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 hơn - họ cột và không gian khóa - có thể được sử dụng để phân chia hoặc nhóm dữ liệu của bạn lại với nhau.

Xem thêm Câu hỏi này: Cassandra: Cột con là gì

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

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

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

Tất nhiên, bạn có thể sử dụng Cassandra như một 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 cửa hàng hướng tài liệu thực.


5
Một họ cột giống như một bảng. Một hàng giống như một hàng bảng. Các cột giống như các cột cơ sở dữ liệu, ngoại trừ việc chúng có thể được xác định nhanh chóng, vì vậy bạn có thể có một bảng được điền 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 từng khóa đơn.
David Raab,

1
Nếu điều đó đúng, thì MongoDB định nghĩa cơ sở dữ liệu hướng tài liệu như thế nào trong khi Cassandra là định hướng cột. Họ khác nhau như thế nào?
Luke

3
@Luke Định hướng cột trông khá giống với RDBMS không có giản đồ, nhưng bên cạnh cấu trúc lỏng lẻo, sự khác biệt chính là nó không phải là quan hệ.
user327961

1
@ user327961 Nhưng MongoDB cũng giống như một RDBMS không có lược đồ và nó cũng không có quan hệ.
huggie,

54

Sự khác biệt chính là kho 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 ý, tức là các tài liệu con trong các tài liệu con, danh sách có tài liệu, v.v. trong khi các kho lưu trữ cột (ví dụ: Cassandra và HBase) chỉ cho phép một định dạng cố định, ví dụ: một cấp nghiêm ngặt hoặc từ điển hai cấp.


Trong trường hợp này, mongo (tài liệu) có thể làm những gì cassendra (Cột) có thể. Tại sao Cột là cần thiết sau đó?
sanjay patel

1
Đó là sự cân bằng giữa các tính năng khác nhau, với thiết kế hướng theo cột, công cụ lưu trữ có thể hiệu quả hơn nhiều so với công cụ lưu trữ định hướng tài liệu. MongoDB phải viết lại toàn bộ tài liệu trên đĩa nếu nó phát triển lớn hơn, nhưng Cassandra thì không cần (đây là một sự đơn giản hóa, tất nhiên, có rất nhiều chi tiết cho điều này). Điều này làm cho Cassandra nhanh hơn nhiều khi viết.
Theo

29

Trong "insert", để sử dụng các từ rdbms, Document-based phù hợp và dễ hiểu 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 về túc số, 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à điều đó làm giảm tính khả dụng. Trên hệ thống nặng ghi một lần / đọc thường xuyên, hãy chuyển sang MongoDB. Cũng nên cân nhắc nếu bạn luôn có kế hoạch đọc toàn bộ cấu trúc của đối tượng. 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 lấy nó và không mạnh lắm trong việc 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 tốt hơn so với dựa trên tài liệu trong "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 chứa nó. Việc ghi không thực sự cần thiết 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 chóng khổng lồ, hãy sử dụng Cassandra. Cũng nên cân nhắc nếu bạn dự định có một lượng lớn dữ liệu cho mỗi khóa và không cần tải tất cả chúng ở mỗi truy vấn. Trong "select", Cassandra chỉ cho phép bạn tải cột bạn cần.

Cũng nên xem xét rằng Mongo DB được viết bằng C ++ và đang ở 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ỉ là ứng cử viên phát hành kể từ ngày hôm qua (nhưng các bản phát hành 0.X đã chuyển sang sản xuất 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 để trở thành một giải pháp Tính 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 mở rộng quy mô, nhưng không duyên dáng như Cassandra.


1
Có gì sai khi một phần mềm được viết bằng C ++ so với Java?
Nayuki

@Nayuki Bây giờ, tôi biết rằng có những khối lượng công việc có tính cạnh tranh cao trong đó việc thu thập rác lười biếng của mô hình quản lý bộ nhớ của Java sẽ tốt hơn so với mô hình quản lý "thủ công" của C ++ về mặt lý thuyết, nhưng nói chung, không khó để vượt trội hơn Java bằng cách viết một đoạn tương đương chương trình bằng C ++, ít nhất là miễn là bạn tắt Ngoại lệ và RTTI. Và nếu bạn sử dụng tốt các hàm coroutines không ngăn xếp và các hàm có thể nối lại, thì cá nhân tôi vẫn chưa thấy Java đánh bại C ++ của mình.
Patrickjp93

0

Tôi muốn nói rằng sự khác biệt chính là cách mỗi loại DB này lưu trữ dữ liệu một cách vật lý.
Với các loại cột, dữ liệu được lưu trữ bởi các cột có thể cho phép các hoạt động / truy vấn tổng hợp hiệu quả trên một cột cụ thể.
Với các loại tài liệu, toàn bộ tài liệu được lưu trữ hợp lý ở một nơi và thường được truy xuất toàn bộ (không thể tổng hợp hiệu quả trên "cột" / "trường").

Điều khó hiểu là một "hàng" cột rộng có thể dễ dàng được biểu diễn dưới dạng tài liệu, nhưng, như đã đề cập, chúng được lưu trữ khác nhau và được tối ưu hóa cho các mục đích khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.