Một số hệ quản trị cơ sở dữ liệu phổ biến – Phần 5: Tìm hiểu về CouchDB

Một số hệ quản trị cơ sở dữ liệu phổ biến – Phần 5: Tìm hiểu về CouchDB

CouchDBcơ sở dữ liệu định hướng tài liệu dựa trên JSON và REST-based. Được phát hành lần đầu tiên vào năm 2005, CouchDB được thiết kế dành cho web và vô số sai sót, lỗi và trục trặc đi kèm với hệ thống web. Do đó, CouchDB mang đến sự mạnh mẽ mà hầu hết các cơ sở dữ liệu khác không thể so sánh được. Trong khi các hệ thống khác chịu đựng được sự cố rớt mạng thỉnh thoảng, thì CouchDB phát triển mạnh ngay cả khi có rất ít kết nối

Giống như MongoDB, CouchDB lưu trữ các tài liệu—đối tượng JSON bao gồm các cặp key-value trong đó các giá trị có thể là bất kỳ loại nào trong số nhiều loại, bao gồm các object khác được lồng vào bất kỳ độ sâu nào. Tuy nhiên, ở đây bạn sẽ không thể thực hiện được các truy vấn đặc thù. Thay vào đó, các view được lập chỉ mục được tạo bởi các hoạt động incrmental mapreduce là cách chính để bạn truy vấn tài liệu.

Tổng quan với Couch

CouchDB giống như cái tên nó với hai chữ cốt lõi: thư giãn. Thay vì chỉ tập trung vào hoạt động tốt trong các cụm lớn chạy trên hàng trăm nút, CouchDB nhằm mục đích hỗ trợ nhiều tình huống triển khai khác nhau từ data-center cho đến điện thoại thông minh. Bạn có thể chạy CouchDB trên điện thoại Android, trên MacBook và trong data-center của mình. Được viết bằng Erlang, CouchDB được xây dựng rất khó khăn—cách duy nhất để tắt nó là kill process! Với mô hình lưu trữ chỉ nối thêm, dữ liệu của bạn hầu như không thể bị hỏng và dễ dàng sao chép, sao lưu và khôi phục. CouchDB được định hướng theo tài liệu, sử dụng JSON làm ngôn ngữ lưu trữ và giao tiếp. Tất cả các request đến CouchDB xảy ra thông qua REST của nó. Sao chép có thể là một chiều (từ cơ sở dữ liệu này sang cơ sở dữ liệu khác) hoặc hai chiều (qua lại giữa các cơ sở dữ liệu) và đặc biệt (được kích hoạt theo ý muốn) hoặc liên tục (được kích hoạt theo các khoảng thời gian định kỳ). CouchDB cung cấp cho bạn rất nhiều sự linh hoạt để quyết định cách cấu trúc, bảo vệ và phân phối dữ liệu của bạn.

Frontend-to-Backend Syncing với PouchDB
Trong những năm vừa qua đã chứng kiến sự gia tăng đáng kể về mức độ quan tâm đối với các ứng dụng web vẫn có thể sử dụng được ngay cả khi người dùng offline. Một trong những khó khăn cốt lõi đằng sau việc xây dựng các ứng dụng offline như vậy là vấn đề đồng bộ hóa dữ liệu. Nếu người dùng sử dụng ứng dụng offline trong một giờ và thực hiện nhiều thay đổi, điều gì sẽ xảy ra khi kết nối của họ hoạt động trở lại và sự khác biệt giữa trạng thái client và server cần được giải quyết?
PouchDB là một công cụ rất thú vị đã xuất hiện từ hệ sinh thái CouchDB để giải quyết vấn đề này. PouchDB là một cơ sở dữ liệu nguồn mở được tạo bằng JavaScript, hoạt động như một kho lưu trữ dữ liệu trong trình duyệt, phía máy khách, tự động đồng bộ hóa dữ liệu với CouchDB trên phần back-end
Mình sẽ không đề cập đến PouchDB trong bài viết này, nhưng nhận thấy nó là một giải pháp hấp dẫn cho một vấn đề mà nhiều người gặp phải nhưng có rất ít giải pháp sẵn có. Nếu bạn đang tìm cách sử dụng CouchDB làm phần back-end cho các ứng dụng web, bạn có thể xem qua.

So sánh CouchDb và MongoDb

Một trong những câu hỏi lớn mà mình muốn giải quyết trong bài này là “Sự khác biệt giữa CouchDBMongoDB là gì?” Nhìn bề ngoài, CouchDBMongoDB có vẻ khá giống nhau.Tuy nhiên, có nhiều sự khác biệt, từ triết lý dự án đến việc triển khai đến các đặc điểm về khả năng mở rộng. Chúng ta sẽ đề cập đến nhiều vấn đề trong số này khi khám phá sự đơn giản tuyệt vời của CouchDB

CRUD, Fauxton, và cURL

Bài này, chúng ta sẽ bắt đầu khám phá CouchDB bằng cách sử dụng giao diện web Fauxton của CouchDB để thực hiện các thao tác CRUD cơ bản. Sau đó, chúng ta sẽ truy cập lại cURL để thực hiện lệnh gọi REST. Tất cả các thư viện và trình điều khiển cho CouchDB cuối cùng đều gửi các yêu cầu REST ẩn bên trong, vì vậy sẽ rất hợp lý khi bắt đầu bằng cách hiểu cách chúng hoạt động.

Bắt đầu CouchDB với Fauxton

CouchDB đi kèm với một giao diện web hữu ích được gọi là Fauxton (nó được gọi là Futon trong các bản phát hành trước 2.0). Khi bạn đã cài đặt và chạy CouchDB, hãy mở trình duyệt web tới http://localhost:5984/_utils/. Thao tác này sẽ mở trang đích hiển thị trong hình dưới đây.

Trước khi có thể bắt đầu làm việc với các documents, chúng ta cần tạo một cơ sở dữ liệu để chứa chúng. Chúng ta sẽ tạo một cơ sở dữ liệu để lưu trữ dữ liệu về các nhạc sĩ cùng với dữ liệu về album và bản nhạc từ các đĩa hát của các nghệ sĩ đó. Nhấp vào nút Create Database. Trong cửa sổ bật lên, nhập "music" và nhấp vào Create. Thao tác này sẽ tự động chuyển hướng bạn đến trang của cơ sở dữ liệu. Từ đây, chúng ta có thể tạo document mới hoặc mở document hiện có.

Trên trang của music database, nhấp vào dấu cộng bên cạnh "All Documents" rồi nhấp vào New Doc. Bạn sẽ được điều hướng đến một trang mới, như trong hình dưới đây.

Cũng giống như trong MongoDB, một tài liệu bao gồm một đối tượng JSON chứa các cặp giá trị chính được gọi là các trường. Tất cả tài liệu trong CouchDB đều có trường _id, trường này phải là duy nhất và không bao giờ được thay đổi. Bạn có thể chỉ định _id một cách rõ ràng, nhưng nếu không, CouchDB sẽ tạo một cái cho bạn. Trong trường hợp này giá trị mặc định là giá trị tốt nhất, vì vậy hãy nhấp vào Create Document để hoàn tất.

Ngay sau khi lưu tài liệu, CouchDB sẽ gán cho nó một trường bổ sung có tên _rev. Trường _rev sẽ nhận giá trị mới mỗi khi tài liệu thay đổi. Định dạng cho chuỗi sửa đổi bao gồm một số nguyên theo sau là dấu gạch ngang và sau đó là một chuỗi duy nhất giả ngẫu nhiên. Số nguyên ở đầu biểu thị số lần sửa đổi, trong trường hợp này giá trị là 1

Tên trường _id và _rev được đặt trước trong CouchDB. Để cập nhật hoặc xóa tài liệu hiện có, bạn phải cung cấp cả _id và _rev phù hợp. Nếu một trong hai điều này không khớp, CouchDB sẽ từ chối thao tác. Đây là cách ngăn ngừa xung đột—bằng cách đảm bảo rằng chỉ những bản sửa đổi tài liệu gần đây nhất mới được sửa đổi.

Không có transaction hoặc locking trong CouchDB. Để sửa đổi một bản ghi hiện có, trước tiên bạn đọc nó ra, lưu ý _id và _rev. Sau đó, bạn yêu cầu cập nhật bằng cách cung cấp toàn bộ tài liệu, bao gồm cả _id và _rev. Tất cả các hoạt động đến trước được phục vụ trước. Bằng cách yêu cầu một _rev phù hợp, CouchDB đảm bảo rằng tài liệu mà bạn cho rằng mình đang sửa đổi không bị thay đổi sau lưng.

Với trang tài liệu vẫn đang mở, hãy sửa đổi đối tượng JSON, đối tượng này chỉ nên có một _id. Nhập một cặp khóa/giá trị với một khóa name và một giá trị của The Beatles. Sau đó nhấp vào nút Lưu thay đổi. Đối tượng JSON của bạn sẽ trông như thế này:

{
  "_id": "2ac58771c197f70461056f7c7e00c0f9",
  "name": "The Beatles"
}

CouchDB không giới hạn việc lưu trữ các giá trị chuỗi. Nó có thể xử lý bất kỳ cấu trúc JSON nào được lồng vào bất kỳ độ sâu nào. Sửa đổi JSON một lần nữa, đặt giá trị của khóa album mới thành giá trị sau (đây không phải là danh sách đầy đủ các album của The Beatles):

[
  "Help!",
  "Sgt. Pepper's Lonely Hearts Club Band",
  "Abbey Road"
]

Sau khi bạn nhấp vào Create Document, nó sẽ trông giống như hình dưới đây.

Có nhiều thông tin liên quan về một album hơn là tên của nó, vì vậy hãy thêm một số thông tin. Sửa đổi trường album và thay thế giá trị bạn vừa đặt bằng giá trị này:

[{
  "title": "Help!",
  "year": 1965
},{
  "title": "Sgt. Pepper's Lonely Hearts Club Band",
  "year": 1967
},{
  "title": "Abbey Road",
  "year": 1969
}]

Nhấp vào nút Delete Document nó sẽ xóa tài liệu khỏi cơ sở dữ liệu âm nhạc. Nhưng đừng làm điều đó ngay bây giờ. Thay vào đó, hãy chuyển xuống command và xem cách giao tiếp với CouchDB qua REST.

RESTful CRUD với cURL

Tất cả giao tiếp với CouchDB đều dựa trên REST và điều này có nghĩa là các lệnh được trao đổi thông qua HTTP. Ở đây, chúng ts sẽ thực hiện một số thao tác CRUD cơ bản trước khi chuyển sang chủ đề về view. Để bắt đầu, hãy command prompt và chạy lệnh sau (bao gồm đặt URL gốc cho CouchDB làm biến môi trường để thuận tiện):

$ export COUCH_ROOT_URL=http://localhost:5984
$ curl ${COUCH_ROOT_URL}
{
  "couchdb": "Welcome",
  "version": "2.0.0",
  "vendor": {
    "name": "The Apache Software Foundation"
  }
}

Gửi các yêu cầu GET (mặc định của cURL) truy xuất thông tin về thứ được chỉ định trong URL. Truy cập vào thư mục gốc như bạn vừa làm chỉ thông báo cho bạn rằng CouchDB đã được thiết lập và đang chạy và phiên bản nào đã được cài đặt. Tiếp theo, hãy lấy một số thông tin về cơ sở dữ liệu mà chúng ta đã tạo trước đó (đầu ra được định dạng ở đây để dễ đọc):

$ curl "${COUCH_ROOT_URL}/music/"
{
  "db_name": "music",
  "update_seq": "4-g1AA...aZxxw",
  "sizes": {
    "file": 24907,
    "external": 193,
    "active": 968
  },
  "purge_seq": 0,
  "other": {
    "data_size": 193
  },
  "doc_del_count": 0,
  "doc_count": 1,
  "disk_size": 24907,
  "disk_format_version": 6,
  "data_size": 968,
  "compact_running": false,
  "instance_start_time": "0"
}

Điều này trả về một số thông tin về số lượng tài liệu trong cơ sở dữ liệu, máy chủ đã hoạt động được bao lâu, bao nhiêu hoạt động đã được thực hiện, kích thước đĩa, v.v.

Reading Document với GET

Để truy xuất một tài liệu cụ thể, hãy thêm _id của nó vào URL cơ sở dữ liệu như sau:

$ curl "${COUCH_ROOT_URL}/music/2ac58771c197f70461056f7c7e0001f9"
{
  "_id": "2ac58771c197f70461056f7c7e0001f9",
  "_rev": "8-e1b7281f6adcd82910c6473be2d4e2ec",
  "name": "The Beatles",
  "albums": [
    {
      "title": "Help!",
      "year": 1965
    },
    {
      "title": "Sgt. Pepper's Lonely Hearts Club Band",
      "year": 1967
    },
    {
       "title": "Abbey Road",
       "year": 1969
     }
   ]
}

Trong CouchDB, việc đưa ra các yêu cầu GET luôn an toàn. CouchDB sẽ không thực hiện bất kỳ thay đổi nào đối với tài liệu do GET. Để thực hiện thay đổi, bạn phải sử dụng các lệnh HTTP khác như PUT, POST và DELETE.

Thêm Document với POST

Để tạo một tài liệu mới, hãy sử dụng POST. Đảm bảo chỉ định Content-Type với giá trị application/json; nếu không, CouchDB sẽ từ chối yêu cầu.

$ curl -i -XPOST "${COUCH_ROOT_URL}/music/" \
 -H "Content-Type: application/json" \
 -d '{ "name": "Wings" }'
HTTP/1.1 201 Created
Cache-Control: must-revalidate
Content-Length: 95
Content-Type: application/json
Date: Sun, 30 Apr 2017 23:15:42 GMT
Location: http://localhost:5984/music/2ac58771c197f70461056f7c7e002eda
Server: CouchDB/2.0.0 (Erlang OTP/19)
X-Couch-Request-ID: 92885ae1d3
X-CouchDB-Body-Time: 0
{
  "ok": true,
  "id": "2ac58771c197f70461056f7c7e002eda",
  "rev": "1-2fe1dd1911153eb9df8460747dfe75a0"
}

Mã phản hồi HTTP 201 Created cho chúng ta biết rằng yêu cầu tạo của chúng tôi đã thành công. Nội dung của phản hồi chứa một đối tượng JSON có thông tin hữu ích, chẳng hạn như các giá trị _id và _rev.

Cập nhật Document với PUT

Lệnh PUT được sử dụng để cập nhật một tài liệu hiện có hoặc tạo một tài liệu mới với _id cụ thể. Cũng giống như GET, URL cho URL PUT bao gồm URL cơ sở dữ liệu theo sau là _id của tài liệu.

$ curl -i -XPUT \
"${COUCH_ROOT_URL}/music/2ac58771c197f70461056f7c7e002eda" \
 -H "Content-Type: application/json" \
-d '{
  "_id": "74c7a8d2a8548c8b97da748f43000f1b",
  "_rev": "1-2fe1dd1911153eb9df8460747dfe75a0",
  "name": "Wings",
  "albums": ["Wild Life", "Band on the Run", "London Town"]
}'
HTTP/1.1 201 Created
Cache-Control: must-revalidate
Content-Length: 95
Content-Type: application/json
Date: Sun, 30 Apr 2017 23:25:13 GMT
ETag: "2-17e4ce41cd33d6a38f04a8452d5a860b"
Location: http://localhost:5984/music/2ac58771c197f70461056f7c7e002eda
Server: CouchDB/2.0.0 (Erlang OTP/19)
X-Couch-Request-ID: 6c0bdfffa5
X-CouchDB-Body-Time: 0
{
  "ok": true,
  "id": "2ac58771c197f70461056f7c7e002eda",
  "rev": "2-17e4ce41cd33d6a38f04a8452d5a860b"
}

Không giống như MongoDB, trong đó bạn sửa đổi tài liệu tại chỗ, với CouchDB, bạn luôn ghi đè lên toàn bộ tài liệu để thực hiện bất kỳ thay đổi nào. Giao diện web Fauxton mà bạn đã thấy trước đó có thể khiến nó trông giống như bạn có thể sửa đổi một trường riêng lẻ, nhưng đằng sau hậu trường, nó đang ghi lại toàn bộ tài liệu khi bạn nhấn Save Changes.

Như đã đề cập trước đó, cả hai trường _id và _rev phải khớp chính xác với tài liệu đang được cập nhật, nếu không thao tác sẽ không thành công. Để xem cách thực hiện, hãy thử thực hiện lại thao tác PUT tương tự.

HTTP/1.1 409 Conflict
Cache-Control: must-revalidate
Content-Length: 58
Content-Type: application/json
Date: Sun, 30 Apr 2017 23:25:52 GMT
Server: CouchDB/2.0.0 (Erlang OTP/19)
X-Couch-Request-ID: 5b626b9060
X-CouchDB-Body-Time: 0
{"error":"conflict","reason":"Document update conflict."}

Xóa Document với DELETE

Cuối cùng, bạn có thể sử dụng thao tác DELETE để xóa tài liệu khỏi cơ sở dữ liệu

$ curl -i -XDELETE \
"${COUCH_ROOT_URL}/music/2ac58771c197f70461056f7c7e002eda" \
-H "If-Match: 2-17e4ce41cd33d6a38f04a8452d5a860b"
HTTP/1.1 200 OK
Cache-Control: must-revalidate
Content-Length: 95
Content-Type: application/json
Date: Sun, 30 Apr 2017 23:26:40 GMT
ETag: "3-42aafb7411c092614ce7c9f4ab79dc8b"
Server: CouchDB/2.0.0 (Erlang OTP/19)
X-Couch-Request-ID: c4dcb91db2
X-CouchDB-Body-Time: 0
{
  "ok": true,
  "id": "2ac58771c197f70461056f7c7e002eda",
  "rev": "3-42aafb7411c092614ce7c9f4ab79dc8b"
}

Thao tác DELETE sẽ cung cấp một số sửa đổi mới, mặc dù tài liệu đã biến mất. Cần lưu ý rằng tài liệu không thực sự bị xóa khỏi đĩa mà thay vào đó, một tài liệu trống mới được thêm vào, đánh dấu tài liệu là đã bị xóa. Giống như với bản cập nhật, CouchDB không sửa đổi tài liệu tại chỗ. Nhưng bạn có thể ngầm hiểu tài liệu đã xóa

Tổng kết

Qua bài viết này bạn đã học cách thực hiện các thao tác CRUD cơ bản trong Fauxton và cURL, bạn đã sẵn sàng chuyển sang các chủ đề nâng cao hơn. Vào bài tiếp theo, chúng ta sẽ đào sâu vào việc tạo các view được lập chỉ mục, điều này sẽ cung cấp các cách khác để truy xuất tài liệu thay vì chỉ chỉ định chúng bằng các giá trị _id của chúng.


Bài viết thuộc các danh mục

Bài viết được gắn thẻ



BÌNH LUẬN (0)

Hãy là người đầu tiên để lại bình luận cho bài viết !!

Hãy đăng nhập để tham gia bình luận. Nếu bạn chưa có tài khoản hãy đăng ký để tham gia bình luận với mình


Bài viết liên quan

Một số hệ quản trị cơ sở dữ liệu phổ biến – Phần 4: Tìm hiểu MongoDB

Mongo là một cơ sở dữ liệu JSON document (mặc dù về mặt kỹ thuật, dữ liệu được lưu trữ ở dạng JSON nhị phân được gọi là BSON). Một JSON documnet có thể được ví như một hàng của bảng quan hệ mà không có lược đồ, các giá trị của nó có thể lồng vào nhau tùy ý

Copyright © 2022. Bảo lưu tất cả quyền