Tại sao tôi nên sử dụng cơ sở dữ liệu dựa trên tài liệu thay vì cơ sở dữ liệu quan hệ?


187

Tại sao tôi nên sử dụng cơ sở dữ liệu dựa trên tài liệu như CouchDB thay vì sử dụng cơ sở dữ liệu quan hệ. Có bất kỳ loại ứng dụng hoặc miền điển hình nào mà cơ sở dữ liệu dựa trên tài liệu phù hợp hơn cơ sở dữ liệu quan hệ không?


Có lẽ một cơ sở dữ liệu hướng tài liệu có thể giống với cơ sở dữ liệu "thực thể-thuộc tính-giá trị" (EAV).
ChrisW

Câu trả lời:


167

Có lẽ bạn không nên :-)

Câu trả lời rõ ràng thứ hai là bạn nên sử dụng nó nếu dữ liệu của bạn không liên quan. Điều này thường thể hiện ở chỗ không có cách dễ dàng để mô tả dữ liệu của bạn dưới dạng một tập hợp các cột. Một ví dụ điển hình là cơ sở dữ liệu nơi bạn thực sự lưu trữ tài liệu giấy, ví dụ bằng cách quét thư văn phòng. Dữ liệu là bản PDF được quét và bạn có một số dữ liệu meta luôn tồn tại (được quét tại, được quét bởi, loại tài liệu) và rất nhiều trường siêu dữ liệu có thể tồn tại vào lúc nào đó (số khách hàng, số nhà cung cấp, số đơn đặt hàng, giữ cho đến khi Toàn văn bản OCRed, v.v.). Thông thường bạn không biết trước những trường siêu dữ liệu nào bạn sẽ thêm trong vòng hai năm tới. Những thứ như CouchDB hoạt động tốt hơn nhiều đối với loại dữ liệu đó so với cơ sở dữ liệu quan hệ.

Cá nhân tôi cũng thích thực tế rằng tôi không cần bất kỳ thư viện máy khách nào cho CouchDB ngoại trừ máy khách HTTP, ngày nay được bao gồm trong gần như mọi ngôn ngữ lập trình.

Câu trả lời có lẽ ít rõ ràng nhất: Nếu bạn cảm thấy không đau khi sử dụng RDBMS, hãy ở lại với nó. Nếu bạn luôn phải làm việc xung quanh RDBMS để hoàn thành công việc của mình, cơ sở dữ liệu định hướng tài liệu có thể đáng xem.

Đối với một danh sách chi tiết hơn kiểm tra bài đăng này của Richard Jones .


1
Tôi chưa bao giờ thấy bất kỳ lược đồ cơ sở dữ liệu nào trong hai năm giống với lược đồ ban đầu mà chúng tôi đã bắt đầu với ... vì vậy mọi thứ đều bằng nhau (không phải là ...), bạn nên luôn luôn sử dụng cơ sở dữ liệu schemaless = định hướng tài liệu; mà tôi nghĩ là một cái tên khá dễ gây hiểu lầm ...

2
@ int3 Nếu bạn không thể mô tả dữ liệu của mình dưới dạng một tập hợp các cột, làm thế nào bạn có thể viết các truy vấn thông minh trên dữ liệu đã nói?
Clay Smith

46

CouchDB (từ trang web của họ )

  • Một máy chủ cơ sở dữ liệu tài liệu, có thể truy cập thông qua API JSONful. Nói chung, cơ sở dữ liệu quan hệ không được truy cập đơn giản thông qua các dịch vụ REST, nhưng yêu cầu API SQL phức tạp hơn nhiều. Thông thường các API này (JDBC, ODBC, v.v.) khá phức tạp. REST khá đơn giản.

  • Đặc biệt và không có lược đồ với không gian địa chỉ phẳng. Cơ sở dữ liệu quan hệ có lược đồ phức tạp, cố định. Bạn xác định bảng, cột, chỉ mục, trình tự, khung nhìn và các thứ khác. Couch không yêu cầu mức độ lập kế hoạch tiên tiến phức tạp, đắt tiền, dễ vỡ này.

  • Phân phối, có tính năng nhân rộng mạnh mẽ, tăng cường với phát hiện và quản lý xung đột hai chiều. Một số sản phẩm thương mại SQL cung cấp điều này. Do API SQL và các lược đồ cố định, điều này rất phức tạp, khó khăn và tốn kém. Đối với Couch, nó xuất hiện đơn giản và không tốn kém.

  • Có thể truy vấn và có thể lập chỉ mục, có công cụ báo cáo theo định hướng bảng sử dụng Javascript làm ngôn ngữ truy vấn. SQL và các cơ sở dữ liệu quan hệ cũng vậy. Không có gì mới ở đây.

Vì thế. Tại sao lại là CouchDB?

  • REST đơn giản hơn JDBC hoặc ODBC.
  • Không có Schema đơn giản hơn Schema.
  • Phân phối theo cách xuất hiện đơn giản và không tốn kém.

12
Mặc dù tôi là một fan hâm mộ lớn của cơ sở dữ liệu NoQuery, nhưng yêu cầu đầu tiên (REST đơn giản hơn JDBC) là rất đáng ngờ.
ᆼ ᆺ

2
Giao thức REST có vẻ khá đơn giản đối với tôi, vì nó chỉ là HTTP: không trạng thái, một vài phương thức, v.v., có lẽ JDBC là (dưới mui xe) đơn giản; nó dường như không đơn giản hơn, chỉ dựa trên trạng thái.
S.Lott

5
@ S.Lott Không nên trả lời "chung chung" hơn thay vì chỉ hướng đến CouchDb?
Pacerier

"Kế hoạch tiên tiến mong manh" so với những gì? Theo kinh nghiệm của tôi, sự thay thế là không có kế hoạch dẫn đến các cấu trúc dữ liệu spaghetti được sửa đổi theo ý thích.
Tejay Cardon

26

Để lưu trữ ngu ngốc và phục vụ dữ liệu máy chủ khác.

Trong vài tuần qua, tôi đã chơi với một ứng dụng trực tiếp thăm dò các nguồn cấp dữ liệu của tôi (ngon, flickr, github, twitter ...) và lưu trữ chúng trong couchdb. Cái hay của couchdb là nó cho phép tôi giữ dữ liệu gốc trong cấu trúc ban đầu của nó mà không cần phí. Tôi đã thêm trường 'lớp' vào mỗi tài liệu, lưu trữ máy chủ nguồn và viết một lớp kết xuất javascript cho mỗi nguồn.

Tổng quát hóa, bất cứ khi nào máy chủ của bạn liên lạc với máy chủ khác, lưu trữ không có lược đồ là tốt nhất vì bạn không có quyền kiểm soát lược đồ. Như một phần thưởng, couchdb sử dụng các giao thức gốc của máy chủ và máy khách - JSON để biểu diễn và HTTP REST để vận chuyển.


Tại sao không chỉ lưu trữ chúng trong một tệp, hoặc một tệp cho mỗi nguồn cấp dữ liệu?
j_random_hacker

6
bởi vì couchdb cũng cho phép bạn tạo các chế độ xem thú vị bằng cách sử dụng / giảm bản đồ. Ví dụ: tôi có thể tạo chế độ xem dựa trên nguồn dữ liệu hoặc tôi có thể tính tổng số cho mỗi nguồn.
daonb

4
Đó là một điểm tuyệt vời ... nếu bạn đang tiêu thụ dữ liệu và không có quyền kiểm soát đối với lược đồ dữ liệu gửi đến - hãy sử dụng kho lưu trữ tài liệu.
Joshua Robinson

1
Đây là lập luận thực sự thuyết phục đầu tiên tôi từng nghe về giá trị của cơ sở dữ liệu
NoQuery

19

Phát triển ứng dụng nhanh chóng đến với tâm trí.

Khi tôi liên tục phát triển lược đồ của mình, tôi liên tục thất vọng vì phải duy trì lược đồ trong MySQL / SQLite. Mặc dù tôi chưa làm quá nhiều với CouchDB, nhưng tôi thích việc phát triển lược đồ trong quá trình RAD đơn giản như thế nào.

Một trường hợp mà bạn có thể không muốn sử dụng cơ sở dữ liệu không liên quan là khi bạn có nhiều mối quan hệ nhiều-nhiều; Tôi vẫn chưa hiểu về cách tạo các hàm MapReduce tốt xung quanh các loại mối quan hệ này, đặc biệt nếu bạn cần có siêu dữ liệu trong mối quan hệ tham gia. Tôi không chắc chắn, nhưng tôi không nghĩ các hàm CouchDB Map có thể gọi các truy vấn của riêng họ trên cơ sở dữ liệu, vì điều đó có khả năng gây ra các vòng lặp vô hạn.


Điểm tuyệt vời. Kho dữ liệu (và các lược đồ khác) rất tốt cho việc phát triển giai đoạn đầu nhanh chóng. Tuy nhiên, vì những lý do tương tự, chúng rất tốt cho tạo mẫu ở giai đoạn đầu, chúng có vấn đề đối với các ứng dụng sản xuất mạnh mẽ.
Tejay Cardon

6

Sử dụng cơ sở dữ liệu dựa trên tài liệu khi bạn không cần lưu trữ dữ liệu trong các bảng với các trường có kích thước đồng nhất cho mỗi bản ghi. Thay vào đó, bạn có nhu cầu lưu trữ từng bản ghi dưới dạng tài liệu có một số đặc điểm nhất định. Bất kỳ số lượng trường có độ dài bất kỳ có thể được thêm động vào tài liệu bất cứ lúc nào mà không cần phải "sửa đổi bảng" trước. Các trường trong tài liệu cũng có thể chứa nhiều phần dữ liệu.


1

Để giải thích về smdelfin: tính linh hoạt. Bạn có thể lưu trữ dữ liệu trong bất kỳ cấu trúc nào (không có cấu trúc và tất cả) và mọi tài liệu có thể hoàn toàn khác nhau. CouchDB đặc biệt hữu ích vì với các chỉ mục "chế độ xem" của họ, bạn có thể lọc ra các tài liệu cụ thể và chỉ truy vấn chế độ xem đó khi bạn muốn các tập hợp con của cơ sở dữ liệu của mình.

Điểm chiến thắng lớn nhất của tôi về cơ sở dữ liệu tài liệu lưu trữ dữ liệu ở định dạng JSON: đây là định dạng gốc cho JavaScript. Do đó, các ứng dụng web JavaScript hoạt động cực kỳ tốt với CouchDB. Gần đây tôi đã tạo một ứng dụng web sử dụng CouchDB và nó rất nhanh trong khi cũng có thể xử lý cấu trúc dữ liệu thay đổi liên tục.


0

Cơ sở dữ liệu dựa trên tài liệu có lợi thế lớn so với cơ sở dữ liệu quan hệ vì chúng không yêu cầu xác định sơ đồ trả trước - trước khi có thể nhập bất kỳ dữ liệu nào.

Ngoài ra, bạn nên sử dụng cơ sở dữ liệu tài liệu nếu dữ liệu của bạn không liên quan và không thể được lưu trữ trong bảng mà thay vào đó là một tập hợp các hình ảnh, hoặc ví dụ như các bài báo.

Một lợi thế khác là sự dễ dàng sử dụng cơ sở dữ liệu dựa trên tài liệu trong phát triển web. Để biết thêm chi tiết về các mô hình cơ sở dữ liệu NoQuery, hãy kiểm tra nguồn này: https://arxiv.org/ftp/arxiv/ con / 1/99 / 1509.08035.pdf

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.