SQL là gì?

16/03/2022

Cùng tìm hiểu về SQL là gì trong bài viết này nào!

1. SQL là gì?

Đầu tiên là SQL, một LƯU Ý RẤT TO mình để ở đây là:

SQL không phải là một thứ gì đó nói về database và càng không phải là database. SQL là Structure Query Language: dịch sang tiếng Việt nghĩa là ngôn ngữ... mà thôi đừng dịch làm gì.

Cụ thể hơn, SQL là ngôn ngữ cho phép chúng ta viết các câu lệnh để thao tác với dữ liệu trong database:

  • SELECT id, name FROM product
  • DELETE FROM product WHERE id = 10

Không chỉ SELECT, DELETE mà còn kha khá các câu lệnh khác nhưng tựu chung lại là trông nó sẽ giống như dưới: bao gồm nhiều keywords, syntax này nọ và các parameters.

Structure Query Language

Tóm lại SQL là một ngôn ngữ vô cùng powerful để tương tác (insert/update/delete/join...) với data trong database.

Khi nói đến SQL và NoSQL chúng ta ngầm hiểu đó là nói về 2 loại DBMS khác nhau.

  • Relational database: MySQL, MSSQL, Postgres... Đây là những database thường sử dụng để lưu trữ dữ liệu có cấu trúc rõ ràng, có tính quan hệ với nhau và quan trọng nhất là sử dụng SQL để truy vấn data.
  • Non-relational database:: MongoDB, Cassandra, DynamoDB... Hiểu một cách đơn giản nó ngược lại so với SQL. Đây là những database có khả năng lưu trữ dữ liệu phi cấu trúc, không cần thể hiện quan hệ ràng buộc với nhau, không sử dụng SQL để truy vấn data.

2. Database structure

Chắc chắn từ thuở chân ướt chân ráo mới vào nghề, gần như 100% chúng ta bắt đầu với SQL và relational database.

Trong relational database, data được tổ chức dưới dạng table bao gồm column (field) và row. Chúng ta cần biết rõ data schema để tiến hành tạo column cho phù hợp. Ví dụ với table Product chứa thông tin của các sản phẩm bao gồm một vài column cơ bản như id, product_name, price, description.

relational database,

Khi có một sản phẩm mới thì thêm một record vào table Product với các thông tin id, name, price, description. Nếu sản phẩm mới không có thông tin description cũng chẳng phải vấn đề gì lớn lắm. Nhưng nếu sản phẩm mới có thêm một vài extra data như tags, manufatured date... thì đúng là khó rồi.

Thực ra cũng không khó lắm, chỉ cần tạo thêm column mới. Ok, vậy nếu tiếp tục có 1 sản phẩm khác lại thêm vài extra data khác thì sao, và cứ liên tục như vậy... thì đúng là.. khó vẫn hoàn khó. Ngoài ra, các sản phẩm không có extra data thì giá trị của các column đó sẽ là null, là empty. Đại khái trông sẽ như này:

relational database 1

Như vậy với relational database, ta cần xác định rõ cấu trúc của data được lưu vào database hay nói cách khác là define clearly data schema và nó cũng là điều cực kì quan trọng. Vì toàn bộ các record (row) trong table đều phải tuân thủ theo các column đã được define và chỉ có thể thực hiện thao tác với data theo dạng đó (table/row/column).

Dù product có extra field hay không thì cũng đều cần đưa về một format để insert vào table. Nếu có giá trị thì lưu giá trị, nếu không có thì lưu null, chẳng thể bỏ đi được.

3. Relation

Một điều quan trọng khác trong thế giới relational database là không chỉ thao tác với một table mà có thể với nhiều table khác và những table này cũng có thể có relation (quan hệ).

Ví dụ có 3 tables User, Order và Product đại diện cho 3 thứ quan hệ với nhau: khách hàng, đơn hàng và sản phẩm.

  • User: lưu thông tin khách hàng.
  • Product: lưu thông tin về sản phẩm.
  • Order: lưu thông tin đơn hàng mà khách hàng đã đặt. Một user có thể có nhiều order, và một product có thể thuộc nhiều order khác nhau. Trực tiếp tạo nên sự liên quan giữa user, product và order.

Từ đó chúng ta có thể tạo một kết nối từ hai thứ tưởng chừng không liên quan nhưng lại rất lan quyên đến nhau là user và product. Trông thế này:

relation

4. Types of relation

Phần này chắc chắn đã quá quen thuộc, không cần trình bày dài dòng. Tuy nhiên mình vẫn muốn đưa vào vì nó chính là điểm mạnh của SQL và relational database. Có tất cả 3 loại relation là:

  • One to One.
  • One to Many.
  • Many to Many.

One to One

Ví dụ có 2 table là UserInfo: lưu thông tin chung như tên, tuổi, giới tính... và UserContact: lưu thông tin liên lạc.

One to One

Một user chỉ có một record ở table UserInfo và related đến một record ở table UserContact thông qua contact_id.

Có thể một số bạn sẽ đặt câu hỏi sao không gộp chung thành một table cho đơn giản mà phải tách làm 2 table và quan hệ One to One làm gì cho phức tạp?

Có 2 lí do chính cho việc này:

  • Khách quan: tăng tốc độ thao tác (insert/delete/update/select) với data, tất nhiên nó là rất nhỏ và chỉ phát huy tác dụng khi table có số lượng record cực lớn. Nhưng vì sao lại tăng tốc độ? Chúng ta cần hiểu cơ chế database lưu trữ data và cách thức data được lấy lên từ disk thế nào.
  • Chủ quan: làm cho database trông clear hơn và phục vụ đúng mục đích hơn. Nếu gộp cả 2 table vào thì có tới 20 columns chẳng hạn, nhưng nếu tách ra 3 - 4 table phục vụ cho từng mục đích khác nhau thì số lượng columns chỉ còn 5 - 6. Ví dụ có những lúc chỉ cần thông tin liên lạc để gửi mail thì select từ table UserContact, hoặc hiển thị profile thì chỉ cần UserInfo.

One to Many

Một ngày đẹp trời user muốn thêm địa chỉ và số điện thoại mới nhưng không muốn bỏ địa chỉ cũ. Sử dụng 2 table như trên thì đúng là.. hơi khoai.

Nếu bạn là tín đồ của Shopee thì sẽ thấy khi order chúng ta có thể chọn địa chỉ giao hàng trong một danh sách các địa chỉ từ trước đó hoặc được tạo mới. Mà chẳng cần là tín đồ Shopee cũng biết khi design system là phải nghĩ đến điều này.

Có nghĩa là một user hoàn toàn có thể có một hoặc nhiều địa chỉ khác nhau. Đó là ví dụ của One to Many relation, trông nó như này:

one to many

Many to Many

Cuối cùng là Many to Many relation, rất phổ biến trong đời sống thực. Ví dụ một đơn hàng có thể có nhiều sản phẩm, và cùng mã sản phẩm đó cũng có thể nằm trong nhiều đơn hàng khác nhau.

Vậy thể hiện nó trên database với table như thế nào? Nếu chỉ có 2 table là Order và Product thì có 2 cách như sau:

  • Mỗi table sẽ có thêm reference đến table kia thông qua id. Nếu có 3 orders và 3 products thì cần tổng cộng tới 9 records ở mỗi table (bao gồm cả duplicate data) để thể hiện quan hệ này...
  • Mỗi table có thêm một column để lưu list các reference_id đến table kia...

Cả 2 cách trên đều stupid nên các engineer đi trước có cách khác là tạo một table trung gian lưu quan hệ của order và product. Trông nó như này:

many to many

Thêm một bảng nhưng so với 2 cách trên thì.. perfect hơn nhiều. Không duplicate data, mỗi table chỉ có đúng 3 orders và 3 products, relation lúc này chuyển sang table trung gian là OrderProduct.

5. Finalize

Chốt lại, SQL được sử dụng để tương tác với data của relation database và có 2 tính chất cực kì quan trọng:

  • Strict schema: data được lưu trữ tại các table có tính chất cố định và cần được define từ trước.
  • Relational data: data được lưu trữ phân tán trên nhiều table khác nhau và kết nối với nhau thông qua relation và SQL là thứ dùng để tương tác với relation đó (JOIN). Càng nhiều data phân tán trên nhiều table khác nhau thì SQL query càng dài, nhưng nó chính là điểm mạnh của SQL.

Để tìm hiểu NoSQL là gì và câu chuyện giữa SQL và NoSQL như thế nào, hãy đón đọc bài viết tiếp theo nhé!

Sưu tầm

Japan IT Works 

 



Việc làm theo chuyên ngành

Việc làm theo ngành

Việc làm theo tỉnh thành