Sự khác biệt giữa SQL và NoSQL

(Ngày: 07/01/2020)
SQL và NoSQL là hai loại truy vấn được sử dụng phổ biến hiện nay. Nếu SQL là cơ chế lưu trữ dữ liệu chính thì NoSQL hiện cũng được sử dụng phổ biến như MongoDB, Redis, Apache Cassandra.

SQL và NoSQL là hai loại truy vấn được sử dụng phổ biến hiện nay. Nếu SQL là cơ chế lưu trữ dữ liệu chính thì NoSQL hiện cũng được sử dụng phổ biến như MongoDB, Redis, Apache Cassandra.

SQL tables và NoSQL Documents

SQL databases cung cấp kiểu lưu trữ dữ liệu dưới dạng bảng và các bảng này có quan hệ với nhau.

Chẳng hạn thông tin books trong bảng được đặt tên là books. Mỗi một row ứng với một record, mỗi column ứng với mỗi field dữ liệu. NoSQL databases lưu trữ dưới dạng JSON dưới dạng field-value từng cặp một.

{

  ISBN: 9780992461225,

  title: "JavaScript: Novice to Ninja",

  author: "Darren Jones",

  format: "ebook",

  price: 29.00

}

Nó tương tự document được lưu trữ trong một collection, như một bảng trong SQL vậy. Dù vậy, bạn có thể lưu bất kỳ dữ liệu nào mà mính thích chẳng hạn:

{

  ISBN: 9780992461225,

  title: "JavaScript: Novice to Ninja",

  author: "Darren Jones",

  year: 2014,

  format: "ebook",

  price: 29.00,

  description: "Learn JavaScript from scratch!",

  rating: "5/5",

  review: [

    { name: "A Reader", text: "The best JavaScript book I've ever read." },

    { name: "JS Expert", text: "Recommended to novice and expert developers alike." }

  ]

}

SQL table thì lại tạo ra một mẫu dữ liệu rất chặt chẽ từ datatype, field name, validation và đó cũng là điểm mấu chốt có thể gây ra những sai lầm. NoSQL thì có thể lưu ở mọi nơi nên vẫn có thể gặp vấn đề về tính nhất quán.

SQL schema và NoSQL Schemaless

Trong SQL databases, t có thể thêm dữ liệu nếu bạn tạo ra bảng và field types tương ứng được gọi là shema. Schema chứa những thông tin về database mà bạn đang sử dụng như: primary keys, indexes, relationships,… Do đó, schema phải được design và implements đầu tiên. Tuy nhiên nó cũng có thể update sau nhưng những thay đổi lớn sẽ trở nên phức tạp hơn khi nhìn vào file schema.

Còn trong NoSQL, dữ liệu được add mọi nơi và vào bất kỳ lúc nào. Chẳng hạn,  trong MongDB đoạn dưới đây sẽ tạo ra một document mới trong book collection. MongDB sẽ tự động add id unique cho mỗi document trong một collection.

db.book.insert(

  ISBN: 9780994182654,

  title: "Jump Start Git",

  author: "Shaumik Daityari",

  format: "ebook",

  price: 29.00

);

NoSQL database có thể phù hợp hơn với các dự án mà yêu cầu dữ liệu ban đầu rất khó xác định.

SQL Normalization vs NoSQL Denormalization

Nếu muốn thêm thông tin nhà publisher vào databases. Mọt nhà xuất bản có thể cung cấp nhiều books. Vì vậy, trong một cơ sở dữ liệu SQL tạo một bảng publisher_tbl sau đó add một field publisher_id vào books_tbl để tham chiếu đến mỗi bản ghi trong publisher_tbl

Điều này sẽ giúp giảm thiểu sự thừa dữ liệu, không lặp lại thông tin publisher cho mỗi cuốn sách – chỉ có tham chiếu đến nó thôi. Kỹ thuật này còn được gọi là chuẩn hóa (Normalization) và mang lại những lợi ích thiết thực.

Chúng ta có thể sử dụng các kỹ thuật chuẩn hóa trong NoSQL. Các documents trong book collection.

{

  ISBN: 9780992461225,

  title: "JavaScript: Novice to Ninja",

  author: "Darren Jones",

  format: "ebook",

  price: 29.00,

  publisher_id: "SP001"

}

Nó sẽ tham chiếu đến mỗi document trong publisher collection.

{

  id: "SP001"

  name: "SitePoint",

  country: "Australia",

  email: "feedback@sitepoint.com"

}

Tuy nhiên, điều này không phải lúc nào cũng tốt bởi các nguyên nhân dưới đây. Chúng ta có thể lựa chọn để không chuẩn hóa document lặp lại thông tin nhà xuất bản cho mỗi book:

{

  ISBN: 9780992461225,

  title: "JavaScript: Novice to Ninja",

  author: "Darren Jones",

  format: "ebook",

  price: 29.00,

  publisher: {

    name: "SitePoint",

    country: "Australia",

    email: "feedback@sitepoint.com"

  }

}

Điều này sẽ làm tốc độ query nhanh hơn, nhưng khi update thông tin của publisher thì lại phải update rất nhiều bản ghi.

SQL Relational JOIN vs NoSQL

SQL query cung cấp JOIN query rất mạnh mẽ. Chúng ta có thể lấy dữ liệu liên quan trong nhiều bảng bằng cách sử dụng một câu lệnh SQL.

Vì dụ:

SELECT books.title, books.author, publisher.name

FROM book

LEFT JOIN books.publisher_id ON publisher.id;

NoSQL không trang bị JOIN. Nếu chúng ta sử dụng collection như mô tả trên, chúng ta cần phải get all các documents trong book collection, lấy tất cả các tài liệu của nhà xuất bản liên quan và liên kết chúng bằng tay trong logic chương trình của chúng ta. Đây là một trong những lý do denormalization thường là cần thiết.

SQL vs NoSQL Transactions

Trong SQL, hai hoặc nhiều record update có thể được thực hiện trong một transaction – đảm bảo tất cả update thành công hoặc nếu 1 record update fails thì rollback lại toàn bộ các record khác. Điều này đảm bảo tính đồng nhất cho dữ liệu.

Trong NoSQL, việc sửa đổi một document là riêng lẻ. Hay nói theo cách khác, nếu bạn đang cập nhật ba giá trị trong một document, cả ba đều được cập nhật thành công hoặc nó vẫn không thay đổi. Tuy nhiên, không có transaction tương đương để update cho nhiều document. Có những option tương tự như transaction, nhưng chúng phải được xử lý thủ thông trong khi viết code.

SQL vs NoSQL Performance

NoSQL thường được cho là nhanh hơn SQL. Điều này không đáng ngạc nhiên, NoSQL thì denormalized cho phép bạn lấy được tất cả thông tin về một item cụ thể với các codition mà không cần JOIN liên quan hoặc truy vấn SQL phức tạp.

Để hệ thống SQL hoạt động tốt và nhanh thì việc design tốt là rất quan trọng và ngược lại.

viblo.asia