Từ bảng nhạc sang bảng địa phương
Theo trang SGK cập nhật, bài vận dụng xét tỉnh/thành phố và phường/xã. Trong **CSDL giả định** có `tinh(idTinh,tenTinh)` và `xa(idXa,tenXa,idTinh)`: `xa.idXa` là PRIMARY KEY; `xa.idTinh` là FOREIGN KEY tới `tinh.idTinh`. Nếu quy ước không cho hai phường/xã cùng tên **trong một tỉnh**, thêm UNIQUE `(tenXa,idTinh)`. Hai tỉnh khác nhau vẫn có thể có một phường/xã cùng tên. Quy tắc này cần được nêu rõ trước khi tạo chỉ mục.
Dùng T01 = Tỉnh Mẫu A, T02 = Thành phố Mẫu B, X01/X02 là mã giả. Các mã ấy không phải mã hành chính thật. Không thêm cấp huyện vào sơ đồ hai cấp của trang cập nhật. Khi có nhu cầu dùng dữ liệu địa phương thực, phải đối chiếu nguồn hành chính hiện hành ở thời điểm triển khai; bài này chỉ luyện thiết kế bảng.
Giữ cùng một cách kiểm
Trước khi lưu, kiểm `tinh` đã có bảng và `idTinh` làm khóa chính, kiểu của `xa.idTinh` khớp với `tinh.idTinh`, ba trường của `xa` có ý nghĩa rõ, UNIQUE gồm đúng cặp và Foreign keys trỏ đúng bảng/cột. Khi nhập hàng phường/xã, `idTinh` phải là mã tỉnh/thành phố đã tồn tại.
Cách suy nghĩ này giống `bannhac → nhacsi`: một mã riêng cho từng hàng, một mã tham chiếu sang bảng cha, và một cặp giá trị được giữ không trùng **theo quy ước của bài toán**. Tên có thể giống ở hai tỉnh, nên không dùng `tenXa` một mình làm khóa chính.
Tạo bảng xa với mã số trong CSDL học tập
Các nhãn T01/X01 ở sơ đồ giúp đọc quan hệ. Trong lần thực hành này, dùng **mã số INT** giống Bài 19; không gõ T01 vào cột INT. Bảng `tinh` đã có Tỉnh Mẫu A mã 1, Thành phố Mẫu B mã 2. Đây đều là dữ liệu giả.
Trên HeidiSQL 12.21.1.1 tiếng Anh/Linux, chọn CSDL học tập → Create new → Table, đặt tên `xa`. Dùng Add khai báo:
| Trường dữ liệu | Kiểu và điều kiện |
|---|---|
| idXa | INT, NOT NULL, AUTO_INCREMENT, PRIMARY |
| tenXa | VARCHAR(255), NOT NULL, No default value |
| idTinh | INT, NOT NULL, No default value; cùng kiểu/Unsigned với tinh.idTinh |
Chọn đồng thời `tenXa`, `idTinh` để tạo **một UNIQUE gồm hai cột**. Trong Foreign keys, Add một dòng: Columns là `idTinh`, Reference table là `tinh`, Foreign columns là `idTinh`; giữ NO ACTION rồi Save. Mở lại cấu trúc, kiểm PRIMARY/UNIQUE/FK trước khi nhập dữ liệu. Nếu ô idTinh vẫn mặc định 0, đổi về No default value: mã 0 không có trong bảng tỉnh của bài tập này.
Bài luyện
Trong mô hình hai cấp giả định, xa.idTinh có vai trò gì?
Tên nằm ở tenXa.
idXa được chọn làm khóa chính.
Mã tỉnh nối mỗi hàng phường/xã tới tỉnh/thành phố.
Không thuộc CSDL nhạc.
Lời giải
xa.idTinh lưu mã tỉnh/thành phố mà hàng phường/xã thuộc về và tham chiếu tinh.idTinh.
Bài luyện
Hai tỉnh T01 và T02 cùng có phường tên “Phường Mẫu”. UNIQUE(tenXa,idTinh) sẽ làm gì?
Cặp (Phường Mẫu,T01) khác (Phường Mẫu,T02).
UNIQUE đặt trên cặp, không chỉ tên.
Ràng buộc không gộp hàng.
Ràng buộc không tự đổi tên.
Lời giải
Hai hàng có cùng tên nhưng khác mã tỉnh nên không trùng cặp.
Bài luyện
Vì sao bài tập dùng T01, X01 thay cho tên và mã địa phương thật?
Có thể dùng mã số nếu hai đầu quan hệ khớp kiểu.
Mục tiêu là học cách nối bảng bằng ví dụ giả.
utf8mb4 lưu được tiếng Việt.
Trong mô hình này mỗi hàng phường/xã có mã tỉnh.
Lời giải
Mã giả làm rõ cấu trúc quan hệ mà không gây nhầm với mã, tên hoặc địa giới đang có hiệu lực.
Đang học