Database (Cơ sở dữ liệu) là cái gì? Tại sao Model lại dùng Database? Phần 1

Dịch vụ nấu cơm bằng nồi cơm điện của chúng ta đang rất phát triển. Khách mới cũng nhiều mà khách cũ cũng đông, Mỗi khách lại thích một loại gạo khác nhau, đặt số lượng cơm khác nhau, và đến nhận cơm vào những lúc khác nhau nốt. Bạn không thể nhớ hết được tên khách, loại gạo, thời gian, còn phải quản lí sô gạo còn trong kho, mỗi loại dư bao nhiêu, bao giờ nhập được gạo mới, còn tình trạng nồi cơm, cái nào nấu nhanh, cái nào nấu chậm, cái nào bị hỏng. Cái việc nấu cơm bằng nồi cơm điện này không đơn giản. Bạn cần một chỗ nào đó để ghi lại những thông tin này. Và đó chính là lúc cái gì ra đời? ………… sổ kế toán ra đời (Chưa đến database đâu :p ).
sổ kế toán

Trong sổ, bạn kẻ một cái bảng gồm các cột: tên khách hàng, loại cơm, số lượng, thời gian đặt, thời gian lấy cơm. Mỗi khách hàng sẽ được ghi vào một dòng. Thật là đơn giản :)) Bạn cũng quản lí các loại gạo bạn có bằng một quyển sổ tương tự tên là sổ gạo. Một quyên sổ nữa quản lí tiền nợ của khách hàng, tiền nợ với người bán gạo, gọi là sổ nợ. Tập sổ này tọa thành cơ sở dữ liệu (database) về cửa hàng của bạn. Nếu đống này được lưu trong máy tính thì thành cái chúng ta đang nghĩ ở tiêu đề. Cơ sở dữ liệu cho cái framework của chúng ta. Mỗi quyển sổ chứa một cái bảng là một bảng (table) trong database.
cơ sở dữ liệu

Khách hàng càng đông, công việc càng nhiều, đến một ngày, có một khách hàng mới đến tên là Nguyễn Tiến Thành, người này lại trùng tên với một khách hàng thân thiết tên là Nguyễn Tiến Thành. Làm cách nào để phân biệt được 2 người này, giao nhầm cơm thì có mà chếttt. Bạn là một người rất thông minh, bạn kẻ thêm một cái cột bên trái sổ, bé bé thôi, nhưng quan trọng. Khách hàng thân thiết Thành cũ ghi là thanh102, Khách mới ghi là thanh203. Cột này không lưu thông tin của khách nhưng trở thành cột quan trọng nhất trong bảng gọi là khóa chính - primary key.

Tuy là khách hàng thân thiết nhưng khác hàng thanh102 ko nhận cơm trả tiền, mà trả tiền vào cuối tháng. Nên ở sổ nợ sẽ có nội dung như sau: Mã khách hàng: thanh102 (ko dùng tên do bị trùng), tiền nợ 100k, ngày nợ 16/09/2019. Cột mã khách hàng này liên kết với cái khóa chính phía trên là khóa ngoài - foreign key. Liên kết này làm cho cơ sở dữ liệu loại này được gọi là cơ sở dữ liệu quan hệ.

Khách hàng ngày càng đông, sổ khách hàng dày lên, dày quá, cái cột khóa chính kia hay đấy nhưng lại ko giúp ích được gì khi tìm tên khách hàng. Bạn vẫn phải lật từng trang, đọc từng dòng, sờ từng tên. Không thể chịu khổ mãi được, bạn quyết định áp dụng kến thức của học sinh lớp 6, xếp các tên khách hàng theo thứ tự abc…vxy, với mỗi chứ cái đầu tiên sẽ đc dán nhãn. Thằng khách hàng cuối tháng mới trả tiền sẽ chỗ cai nhãn có chữ T. Vậy là quyển sổ sẽ thế này, khách hàng tên Yêu sẽ ở cuối sổ, tên Anh sẽ ở đầu sổ. Khi muốn tìm thằng Anh thì nhìn nhãn A, trà từ đầu xuống, khi tìm thằng Yêu thì nhìn nhãn Y, trả ở cuối sổ lên. Và người ta gọi nó là chỉ mục - index.

Hàng ngày, chúng ta giao cơm, nhận tiền, ghi sổ, giao cơm, nhận tiền, ghi sổ, giao cơm, ghi sổ,… Thế nhỡ một ngày, giao cơm, ghi sổ rồi quên nhận tiền thì sao, hoặc là giao cơm, nhận tiền mà quên ghi sổ, hoặc là giao cơm xong, động đất, khách chạy mất dép, chưa nhận tiền, ghi sổ mà mất hộp cơm thì làm như thế nào. Bạn vẫn rất thông minh, bạn nghĩ ra cái gọi là giao dịch - transaction.

  • Đầu tiên, bạn đánh 1 cái dầu vào sổ Bắt đầu giao dịch - Begin transaction
  • Bước 1, giao cơm
  • Bước 2, nhận tiền
  • Bước 3, ghi sổ
  • Cuối cùng, đánh đấu Hoàn thành giao dịch - Commit transaction

Bây giờ, bất kể bước nào thiếu, bạn sẽ quay lui - rollback về trạng thái trước khi bắt đầu giao dịch. Cơm bạn vẫn giữ, tiền khách vẫn cầm, sổ vẫn sạch như cũ.

Trong phần 2, mình sẽ nói về các “trường phái” kết nối với cơ sở dữ liệu: kiểu truyền thống, kiểu đối tượng. Tại sao trong php có mysqli lại còn có PDO. Tại sao tạo bảng trong mysql lại dùng chatset utf8_mb4 mà ko phải utf8. Và cái đoạn kết nối trong framework của chúng ta sẽ ntn. Framework của chúng ta “pro” nên sẽ có cả SQL và NoSQL. Hy vọng thế :p
Hết động lực rồi. Không viết tiếp nữa.