Entity Relationship Diagram(ERD)
Sơ đồ mô tả dữ liệu hệ thống lưu trữ: các thực thể, thuộc tính và quan hệ giữa chúng kèm số lượng. Là bản chốt dữ liệu với khách trước khi dev tạo bảng đầu tiên.
Định nghĩa
Trước khi dev tạo cái bảng đầu tiên, có một cuộc trò chuyện phải xong: hệ thống lưu những gì, và một khách hàng thì được có mấy địa chỉ. ERD là biên bản của cuộc trò chuyện đó, vẽ ra hình để khách gật hay lắc chứ không cần đọc SQL.
Sơ đồ này mô tả dữ liệu nằm yên trong cơ sở dữ liệu: thực thể, thuộc tính, và quan hệ kèm số lượng.
Ba mức chi tiết, đừng trộn
- Conceptual: chỉ tên thực thể và quan hệ. Không thuộc tính, không khoá. Đây là bản để mở ra nói chuyện với khách và với sếp, vẽ hai mươi phút là xong.
- Logical: đủ thuộc tính, khoá chính, khoá ngoại, đã chuẩn hoá. Mức của BA. Cũng là mức đi kèm data dictionary trong tài liệu bàn giao.
- Physical: tên bảng thật, kiểu dữ liệu, độ dài, index, ràng buộc. Của dev và DBA, bạn đọc để đối chiếu thôi.
Đưa bản physical cho trưởng phòng nghiệp vụ xem là cách nhanh nhất để buổi họp chuyển sang chủ đề khác.
Đọc ký hiệu chân quạ
Ký hiệu crow's foot đọc theo hai vị trí ở mỗi đầu đường nối. Ký hiệu ngoài cùng cho biết số lượng: một gạch là "một", ba chân toè là "nhiều". Ký hiệu nằm sát bên trong cho biết có bắt buộc không: vòng tròn là "có thể không có" (0), gạch là "bắt buộc có" (1). Ghép hai cái lại đọc thành câu: một khách hàng có từ 0 tới nhiều đơn hàng, một đơn hàng thuộc đúng một khách hàng.
Mỗi lần thấy quan hệ nhiều-nhiều, dừng lại hỏi một câu: mối quan hệ đó có thuộc tính riêng không. Nếu có thì bảng trung gian là một thực thể nghiệp vụ thật sự, không phải chỗ nối kỹ thuật.
So sánh với class diagram
| Câu hỏi | ERD | Class diagram |
|---|---|---|
| Mô hình hoá gì | Dữ liệu lưu trữ | Đối tượng chạy trong hệ thống |
| Có phương thức không | Không | Có |
| Quan hệ n-n | Phải tách thành bảng trung gian | Giữ nguyên, ORM lo phần bảng |
| Kế thừa | Không có sẵn, phải mô phỏng | Có, vẽ tam giác rỗng |
| BA dùng lúc nào | Chốt dữ liệu, viết data dictionary, làm migration | Đọc để review thiết kế của dev |
Ví dụ thực tế
"Có bạn học hai lớp cùng lúc, mà chuyển lớp giữa khoá thì vẫn phải giữ được lịch sử điểm danh của lớp cũ." Chị quản lý học vụ nói câu đó ngay khi ERD vừa chiếu lên tường, và bản vẽ lúc ấy đang để quan hệ học viên với lớp là 1-n.
Dự án là chuyển dữ liệu từ một đống file Excel sang hệ thống quản lý học viên của một trung tâm tiếng Anh, hơn 17 nghìn hồ sơ, sáu chi nhánh. Vậy là n-n, và bảng trung gian dang_ky phải có ngày bắt đầu, ngày kết thúc, trạng thái. Phát hiện lúc đang vẽ thì sửa một đường trên sơ đồ. Phát hiện sau khi import xong thì phải viết lại toàn bộ script migration và dò lại từng dòng đã nhập.
Mẹo khi đi làm
- Đặt tên thực thể ở dạng số ít, thống nhất một ngôn ngữ, đừng nửa Anh nửa Việt trong cùng sơ đồ.
- Với mỗi thực thể, hỏi thêm: cái này có cần lưu lịch sử thay đổi không. Câu hỏi này hay bị bỏ, và nó là nguồn của nhiều CR sau go-live.
- Hỏi luôn về xoá: xoá mềm hay xoá cứng, xoá cha thì con đi đâu.
- Vẽ nhanh bằng Mermaid
erDiagramđể sơ đồ nằm cùng tài liệu và sửa được bằng cách sửa chữ. Nếu tài liệu nằm trên GitHub hay GitLab thì dán vào là ra hình; còn Confluence Cloud thì hỏi admin xem instance đã cài app render Mermaid chưa, đừng hứa trước.
