Bài viết mô tả quá trình tôi tạo một database đơn giản dùng để phục vụ cho việc dạy và học SQL

Nếu bạn thấy thằng cha tác giả viết dài dòng lê thê quá thì có thể bấm vào đây để xem code luôn (vọc vạch code xong thì nhớ quay lại đọc bài này nha :v)

1. Chọn một chủ đề

Tôi là một fan bóng đá, và tôi chắc rất nhiều bạn đang đọc bài viết này cũng vậy, vì thế tôi chọn chủ đề bóng đá

(Tất nhiên trong thực tế thì nhiều khi chúng ta không có quyền lựa chọn chủ đề. Khách hàng mới là người đưa ra yêu cầu)

Với chủ đề bóng đá, tôi quyết định lựa chọn các đối tượng sau để đưa vào database:

- Giải quốc nội

- Câu lạc bộ

- Giải đấu cup

- Đội tuyển quốc gia

- Cầu thủ

2. Phân tích thiết kế

Sau khi đã lựa chọn được chủ đề và xác định rõ 5 đối tượng cần được lưu trong database, tôi tiến hành xác định mối quan hệ giữa các đối tượng. Cụ thể là:

- Giải quốc nội là dành cho các Câu lạc bộ, còn Giải đấu cup là dành cho Đội tuyển quốc gia

- Một Câu lạc bộ có thể tham dự nhiều Giải quốc nội, ở chiều ngược lại một Giải quốc nội có thể có nhiều Câu lạc bộ. Như vậy giữa 2 đối tượng này tồn tại mối quan hệ nhiều-nhiều (many-to-many relation)

- Một Đội tuyển quốc gia có thể tham dự nhiều Giải đấu cup, ở chiều ngược lại một Giải đấu cup có thể có nhiều Đội tuyển quốc gia. Như vậy giữa 2 đối tượng này cũng tồn tại mối quan hệ nhiều-nhiều

- Một Cầu thủ chỉ đá cho một Câu lạc bộ, ở chiều ngược lại một Câu lạc bộ có thể có nhiều Cầu thủ. Như vậy giữa 2 đối tượng này tồn tại mối quan hệ một-nhiều (one-to-many relation)

- Một Cầu thủ chỉ đá cho một Đội tuyển quốc gia, ở chiều ngược lại một Đội tuyển quốc gia có thể có nhiều Cầu thủ. Như vậy giữa 2 đối tượng này cũng tồn tại mối quan hệ một-nhiều

Để biểu diễn quan hệ một-nhiều giữa Cầu thủ - Câu lạc bộCầu thủ - Đội tuyển quốc gia, tôi làm như sau:

Quan hệ một-nhiều giữa Cầu thủ - Câu lạc bộ và Cầu thủ - Đội tuyển quốc gia
Quan hệ một-nhiều giữa Cầu thủ - Câu lạc bộ và Cầu thủ - Đội tuyển quốc gia

Tôi có 2 bảng: club và national_team lần lượt lưu thông tin của 2 đối tượng Câu lạc bộĐội tuyển quốc gia. Trong mỗi bảng cần có cột ID đóng vai trò là Primary Key để tham chiếu đến từng bản ghi

Tôi có bảng player để lưu thông tin Cầu thủ. Bảng player cũng cần có cột ID đóng vai trò là Primary Key để tham chiếu đến từng bản ghi. Ngoài ra, bảng player cần có thêm 2 cột nữa là club_id và national_id, trong đó:

- cột club_id tham chiếu đến cột ID ở bảng club, qua đó tạo ra một Foreign Key

- cột national_id tham chiếu đến cột ID ở bảng national_team, cũng tạo ra một Foreign Key

Với thiết kế như trên:

- Với một ID cầu thủ bất kì, tôi biết được club_id và national_id của cầu thủ đó. Với club_id, tôi tham chiếu sang bảng club, từ đó tôi biết thông tin về câu lạc bộ của cầu thủ đó. Tương tự như vậy với national_id, tôi biết được thông tin đội tuyển quốc gia của cầu thủ

- Với một ID câu lạc bộ (hoặc đội tuyển quốc gia) bất kỳ, tôi tham chiếu sang cột club_id (hoặc national_id) ở bảng player, từ đó tôi biết được danh sách các cầu thủ của câu lạc bộ (hoặc đội tuyển quốc gia) đó.

Đó là phần thiết kế mô tả quan hệ một-nhiều giữa Cầu thủ - Câu lạc bộCầu thủ - Đội tuyển quốc gia. Giờ chúng ta thiết kế tiếp cho quan hệ nhiều-nhiều giữa Câu lạc bộ - Giải quốc nội Đội tuyển quốc gia - Giải đấu cup 

Để thiết kế database mô tả quan hệ nhiều-nhiều, các bạn có thể tham khảo mục số 1 trong bài viết: Một số pattern trong thiết kế database

Để mô tả quan hệ nhiều-nhiều giữa Câu lạc bộ - Giải quốc nội, tôi dùng một bảng trung gian như sau:

Quan hệ nhiều-nhiều giữa Câu lạc bộ - Giải quốc nội
Quan hệ nhiều-nhiều giữa Câu lạc bộ - Giải quốc nội

Bản chất là chúng ta tách quan hệ nhiều-nhiều thành 2 quan hệ một-nhiều thông qua bảng trung gian 

Tương tự, quan hệ nhiều-nhiều giữa Đội tuyển quốc gia - Giải đấu cup được biểu diễn như sau:

Quan hệ nhiều-nhiều giữa Đội tuyển quốc gia - Giải đấu cup
Quan hệ nhiều-nhiều giữa Đội tuyển quốc gia - Giải đấu cup

Như vậy, sau khi phân tích xong mối quan hệ giữa các đối tượng, ta có bản thiết kế database như sau:

Trong các bảng club, player và national_team tôi có bổ sung thêm một số thông tin như tên sân nhà, tên huấn luyện viên, họ-tên cầu thủ, tuổi, vị trí thi đấu, thứ hạng của đội tuyển, ... Những thông tin này mang tính bổ sung, tùy các bạn lựa chọn thôi :D

3. Code

Sau khi phân tích thiết kế xong, tôi bắt tay vào code

Tôi sử dụng Golang và thư viện go-pg để kết nối vào database PostgreSQL. Ngoài ra tôi dùng thêm pgAdmin để kiểm tra dữ liệu các bảng.

Để chạy PostgreSQL và pgAdmin, tôi sử dụng Docker. Các bạn có thể tham khảo mục 1 của bài viết sau để biết cách cài đặt: PostgreSQL căn bản: Câu lệnh SELECT

Tôi code theo quy trình sau:

- Định nghĩa cấu trúc bảng

- Kết nối vào database PostgreSQL

- Tạo bảng

- Tạo dữ liệu cho từng bảng 

Các bạn có thể xem code của tôi tại: https://github.com/handuy/sample_db

Các bạn cũng có thể bấm vào đây để download luôn file database tôi đã tạo

Sau khi download xong, nếu các bạn không biết làm cách nào để khôi phục dữ liệu thì hãy đón đọc bài viết tiếp theo của tôi :v Sẽ lên sóng ngay ngày mai :D