Entity & Hướng Dẫn Nhập Dữ Liệu
Tài liệu liệt kê 11 entity trong dự án WebBanSach, cấu trúc từng bảng và hướng dẫn chi tiết cách thu thập, điền dữ liệu vào cơ sở dữ liệu theo đúng thứ tự quan hệ.
Do các bảng có quan hệ khóa ngoại, phải nhập theo thứ tự sau — nhập bảng không có FK trước:
TheLoai
the_loai | Quan hệ: N-M với Sach| Cột DB | Field Java | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|---|
ma_the_loai | maTheLoai | PK AUTO | — | Tự động tăng, không cần nhập |
ten_the_loai | tenTheLoai | VARCHAR(256) | ✓ Bắt buộc | Tên thể loại: "Văn học", "Khoa học"… |
- Tham khảo các trang như Tiki, Fahasa để lấy danh sách thể loại phổ biến
- Ví dụ: Văn học, Kinh tế, Thiếu nhi, Khoa học kỹ thuật, Tâm lý – Kỹ năng sống, Lịch sử, Ngoại ngữ
- Thêm vào DB trước tất cả bảng khác
Quyen
quyen | Quan hệ: N-M với NguoiDung| Cột DB | Field Java | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|---|
ma_quyen | maQuyen | PK AUTO | — | Tự động tăng |
ten_quyen | tenQuyen | VARCHAR | ✓ Bắt buộc | Tên quyền, bắt đầu bằng ROLE_ |
Spring Security yêu cầu tên quyền phải có tiền tố ROLE_. Chỉ cần 2 bản ghi: ROLE_USER và ROLE_ADMIN.
HinhThucThanhToan
hinh_thuc_thanh_toan | Quan hệ: 1-N với DonHang| Cột DB | Field Java | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|---|
ma_hinh_thuc_thanh_toan | maHinhThucThanhToan | PK AUTO | — | Tự động tăng |
ten_hinh_thuc_thanh_toan | tenHinhThucThanhToan | VARCHAR | ✓ | Tên hình thức: "COD", "Thẻ tín dụng"… |
mo_ta | moTa | VARCHAR | Tùy chọn | Mô tả thêm về hình thức |
chi_phi_thanh_toan | chiPhiThanhToan | DOUBLE | ✓ | Phí thanh toán (VD: 0, 10000, 15000) |
- COD (Tiền mặt khi nhận hàng) – phí 0đ
- Thẻ tín dụng/ghi nợ – phí 15,000đ
- Ví MoMo – phí 10,000đ
- Chuyển khoản ngân hàng – phí 0đ
HinhThucGiaoHang
hinh_thuc_giao_hang | Quan hệ: 1-N với DonHang| Cột DB | Field Java | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|---|
ma_hinh_thuc_giao_hang | maHinhThucGiaoHang | PK AUTO | — | Tự động tăng |
ten_hinh_thuc_giao_hang | tenHinhThucGiaoHang | VARCHAR | ✓ | Tên: "Giao hàng tiêu chuẩn", "Giao nhanh"… |
mo_ta | moTa | VARCHAR | Tùy chọn | Mô tả thêm, VD: "3-5 ngày làm việc" |
chi_phi_giao_hang | chiPhiGiaoHang | DOUBLE | ✓ | Phí vận chuyển (VD: 25000, 35000) |
- Giao hàng tiêu chuẩn (3–5 ngày) – 25,000đ
- Giao hàng nhanh (1–2 ngày) – 35,000đ
- Giao hàng hỏa tốc (trong ngày) – 50,000đ
NguoiDung
nguoi_dung | Quan hệ: N-M với Quyen 1-N với DonHang, SuDanhGia, SachYeuThich| Cột DB | Field Java | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|---|
ma_nguoi_dung | maNguoiDung | PK AUTO | — | Tự động tăng |
ho_dem | hoDem | VARCHAR | ✓ | Họ và tên đệm, VD: "Nguyễn Văn" |
ten | ten | VARCHAR | ✓ | Tên, VD: "An" |
ten_dang_nhap | tenDangNhap | VARCHAR | ✓ Unique | Username đăng nhập, không trùng |
mat_khau | matKhau | VARCHAR(512) | ✓ | Mật khẩu đã BCrypt hash (không nhập plain text) |
gioi_tinh | gioiTinh | VARCHAR | Tùy chọn | "Nam", "Nữ", "Khác" |
email | email | VARCHAR | ✓ Unique | Email, phải duy nhất |
so_dien_thoai | soDienThoai | VARCHAR | Tùy chọn | Số điện thoại liên hệ |
dia_chi_mua_hang | diaChiMuaHang | VARCHAR | Tùy chọn | Địa chỉ thanh toán/hóa đơn |
dia_chi_giao_hang | diaChiGiaoHang | VARCHAR | Tùy chọn | Địa chỉ nhận hàng mặc định |
Không bao giờ nhập plain text vào cột mat_khau. Dùng API POST /tai-khoan/dang-ky để tạo user — service sẽ tự dùng BCryptPasswordEncoder trước khi lưu. Hoặc dùng tool online: bcrypt-generator.com để tạo hash thủ công.
- Dùng Postman gọi
POST /tai-khoan/dang-kyvới JSON body — an toàn nhất - Sau khi tạo user, gán quyền bằng cách INSERT vào bảng
nguoidung_quyen - Admin đầu tiên: tạo user qua API, sau đó INSERT thủ công vào
nguoidung_quyen
Sach
sach | Quan hệ: N-M với TheLoai 1-N với HinhAnh, SuDanhGia, SachYeuThich, ChiTietDonHang| Cột DB | Field Java | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|---|
ma_sach | maSach | PK AUTO | — | Tự động tăng |
ten_sach | tenSach | VARCHAR(256) | ✓ | Tên đầy đủ của sách |
ten_tac_gia | tenTacGia | VARCHAR(256) | ✓ | Họ tên tác giả |
isbn | ISBN | VARCHAR(256) | Tùy chọn | Mã sách quốc tế, 13 chữ số (ISBN-13) |
mo_ta | moTa | TEXT | Tùy chọn | Mô tả ngắn, tóm tắt nội dung sách |
thong-tin-chi-tiet | thongTinChiTiet | TEXT | Tùy chọn | Thông tin chi tiết: số trang, NXB, năm XB… |
gia_niem_yet | giaNiemYet | DOUBLE | ✓ | Giá bìa gốc (VD: 120000) |
gia_ban | giaBan | DOUBLE | ✓ | Giá bán thực tế (có thể thấp hơn giá bìa) |
so_luong | soLuong | INT | ✓ | Số lượng tồn kho |
trung_binh_xep_hang | trungBinhXepHang | DOUBLE | Tùy chọn | Điểm đánh giá trung bình (0.0 – 5.0), mặc định 0 |
- Google Books API (miễn phí):
https://www.googleapis.com/books/v1/volumes?q=isbn:<ISBN> - Tiki / Fahasa / Shopee Sách: copy thủ công tên, tác giả, giá bán, mô tả
- ISBN Search: isbnsearch.org để tra mã ISBN
- Trường
trung_binh_xep_hangnên để 0, sẽ được cập nhật khi có đánh giá
HinhAnh
hinh_anh | Quan hệ: N-1 với Sach| Cột DB | Field Java | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|---|
ma_hinh_anh | maHinhAnh | PK AUTO | — | Tự động tăng |
ten_hinh_anh | tenHinAnh | VARCHAR(256) | Tùy chọn | Tên file ảnh, VD: "bia-truoc.jpg" |
la_icon | laIcon | TINYINT (bool) | ✓ | 1 = ảnh đại diện chính (thumbnail), 0 = ảnh phụ |
duong_dan | duongDan | VARCHAR | Tùy chọn | URL ảnh online, VD: "https://cdn.../anh.jpg" |
du_lieu_anh | duLieuAnh | LONGTEXT | Tùy chọn | Ảnh dạng Base64 (nếu không dùng URL) |
ma_sach | sach | FK → sach | ✓ NOT NULL | Sách mà ảnh này thuộc về |
Nếu lưu URL thì để du_lieu_anh NULL. Nếu lưu Base64 thì để duong_dan NULL. Mỗi sách nên có đúng 1 ảnh với la_icon = 1 làm ảnh đại diện.
DonHang
don_hang | Quan hệ: N-1 với NguoiDung, HinhThucThanhToan, HinhThucGiaoHang 1-N với ChiTietDonHang| Cột DB | Field Java | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|---|
ma_don_hang | maDonHang | PK AUTO | — | Tự động tăng |
ngay_tao | ngayTao | DATE/DATETIME | ✓ | Ngày đặt hàng, VD: 2025-03-22 |
dia_chi_mua_hang | diaChiMuaHang | VARCHAR(512) | Tùy chọn | Địa chỉ xuất hóa đơn |
dia_chi_nhan_hang | diaChiNhanHang | VARCHAR(512) | Tùy chọn | Địa chỉ giao hàng |
tong_tien_san_pham | tongTienSanPham | DOUBLE | ✓ | Tổng tiền hàng (chưa gồm phí) |
chi_phi_giao_hang | chiPhiGiaoHang | DOUBLE | ✓ | Phí vận chuyển (lấy từ HinhThucGiaoHang) |
chi_phi_thanh_toan | chiPhiThanhToan | DOUBLE | ✓ | Phí thanh toán (lấy từ HinhThucThanhToan) |
tong_tien | tongTien | DOUBLE | ✓ | Tổng thanh toán = tiền hàng + phí GH + phí TT |
ma_nguoi_dung | nguoiDung | FK → nguoi_dung | ✓ NOT NULL | Người đặt hàng |
ma_hinh_thuc_thanh_toan | hinhThucThanhToan | FK → httt | nullable | Phương thức thanh toán được chọn |
ma_hinh_thuc_giao_hang | hinhThucGiaoHang | FK → htgh | nullable | Phương thức vận chuyển được chọn |
tong_tien = tong_tien_san_pham + chi_phi_giao_hang + chi_phi_thanh_toan. Hãy đảm bảo tính đúng khi nhập dữ liệu mẫu.
ChiTietDonHang
chi_tiet_don_hang | Quan hệ: N-1 với Sach, DonHang| Cột DB | Field Java | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|---|
ma_chi_tiet_don_hang | maChiTietDonHang | PK AUTO | — | Tự động tăng (kiểu long) |
so_luong | soLuong | INT | ✓ | Số lượng quyển đặt mua |
gia_ban | giaBan | DOUBLE | ✓ | Giá tại thời điểm đặt hàng (snapshot giá) |
ma_sach | sach | FK → sach | ✓ NOT NULL | Sách được đặt mua |
ma_don_hang | donHang | FK → don_hang | ✓ NOT NULL | Đơn hàng chứa dòng này |
gia_ban trong ChiTietDonHang là snapshot — giá sách lúc khách đặt. Không nên dùng FK để tham chiếu giá từ bảng Sach vì giá có thể thay đổi sau này.
SuDanhGia
su_danh_gia | Quan hệ: N-1 với Sach, NguoiDung| Cột DB | Field Java | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|---|
ma_danh_gia | maDanhGia | PK AUTO | — | Tự động tăng (kiểu long) |
diem_xep_hang | diemXepHang | FLOAT | ✓ | Điểm 1.0 – 5.0, VD: 4.5 |
nhan_xet | nhanXet | VARCHAR | Tùy chọn | Nhận xét dạng text tự do |
ma_sach | sach | FK → sach | ✓ NOT NULL | Sách được đánh giá |
ma_nguoi_dung | nguoiDung | FK → nguoi_dung | ✓ NOT NULL | Người viết đánh giá |
Cần cập nhật lại trường trung_binh_xep_hang trong bảng sach: UPDATE sach SET trung_binh_xep_hang = (SELECT AVG(diem_xep_hang) FROM su_danh_gia WHERE ma_sach = ?) WHERE ma_sach = ?
SachYeuThich
sach_yeu_thich | Quan hệ: N-1 với Sach, NguoiDung| Cột DB | Field Java | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|---|
ma_sach_yeu_thich | maSachYeuThich | PK AUTO | — | Tự động tăng |
ma_nguoi_dung | nguoiDung | FK → nguoi_dung | ✓ NOT NULL | Người đã yêu thích sách |
ma_sach | sach | FK → sach | ✓ NOT NULL | Sách được yêu thích |
Dưới đây là bộ data mẫu đầy đủ liên kết nhau: 2 người dùng, 3 quyển sách, 1 đơn hàng, đánh giá và yêu thích. Các ID được tô màu để dễ theo dõi quan hệ.
the_loai| ma_the_loai | ten_the_loai |
|---|---|
| 1 | Văn học |
| 2 | Tâm lý - Kỹ năng sống |
| 3 | Kinh tế |
| 4 | Thiếu nhi |
| 5 | Khoa học kỹ thuật |
quyen| ma_quyen | ten_quyen |
|---|---|
| 1 | ROLE_USER |
| 2 | ROLE_ADMIN |
hinh_thuc_thanh_toan| ma_hinh_thuc_thanh_toan | ten_hinh_thuc_thanh_toan | mo_ta | chi_phi_thanh_toan |
|---|---|---|---|
| 1 | COD | Thanh toán khi nhận hàng | 0 |
| 2 | Thẻ tín dụng | Visa, Mastercard | 15000 |
| 3 | Ví MoMo | Ví điện tử MoMo | 10000 |
hinh_thuc_giao_hang| ma_hinh_thuc_giao_hang | ten_hinh_thuc_giao_hang | mo_ta | chi_phi_giao_hang |
|---|---|---|---|
| 1 | Giao hàng tiêu chuẩn | 3-5 ngày làm việc | 25000 |
| 2 | Giao hàng nhanh | 1-2 ngày làm việc | 35000 |
| 3 | Hỏa tốc | Giao trong ngày | 50000 |
nguoi_dung| ma_nguoi_dung | ho_dem | ten | ten_dang_nhap | mat_khau (BCrypt) | gioi_tinh | so_dien_thoai | dia_chi_giao_hang | |
|---|---|---|---|---|---|---|---|---|
| 1 | Nguyễn Văn | An | admin | $2a$10$hash... (plain: 123456) | Nam | admin@gmail.com | 0901234567 | 123 Lê Lợi, Q.1, TP.HCM |
| 2 | Trần Thị | Bình | user01 | $2a$10$hash... (plain: abc123) | Nữ | binh@gmail.com | 0912345678 | 456 Nguyễn Huệ, Q.1, TP.HCM |
mat_khau KHÔNG lưu plain text. Tạo user bằng POST /tai-khoan/dang-ky để được tự động hash. Hash ví dụ của "123456" là: $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWynguoidung_quyen| ma_nguoi_dung | ma_quyen | Ý nghĩa |
|---|---|---|
| 1 | 1 | admin → ROLE_USER |
| 1 | 2 | admin → ROLE_ADMIN |
| 2 | 1 | user01 → ROLE_USER |
/nguoi-dung.sach| ma_sach | ten_sach | ten_tac_gia | isbn | gia_niem_yet | gia_ban | so_luong | trung_binh_xep_hang |
|---|---|---|---|---|---|---|---|
| 1 | Đắc Nhân Tâm | Dale Carnegie | 9780671027032 | 120000 | 89000 | 150 | 4.8 |
| 2 | Nhà Giả Kim | Paulo Coelho | 9786041182523 | 95000 | 72000 | 80 | 4.6 |
| 3 | Tư Duy Nhanh Và Chậm | Daniel Kahneman | 9786041060715 | 180000 | 140000 | 45 | 4.7 |
mo_ta và thong-tin-chi-tiet là TEXT dài nên không hiển thị ở đây. Ví dụ mo_ta sách 1: "Cuốn sách kinh điển về nghệ thuật giao tiếp và thuyết phục người khác..."sach_theloai| ma_sach | ma_the_loai | Ý nghĩa |
|---|---|---|
| 1 | 2 | Đắc Nhân Tâm → Tâm lý - Kỹ năng sống |
| 2 | 1 | Nhà Giả Kim → Văn học |
| 3 | 3 | Tư Duy Nhanh Và Chậm → Kinh tế |
| 3 | 5 | Tư Duy Nhanh Và Chậm → Khoa học kỹ thuật |
hinh_anh| ma_hinh_anh | ten_hinh_anh | la_icon | duong_dan | du_lieu_anh | ma_sach (FK) |
|---|---|---|---|---|---|
| 1 | dac-nhan-tam-bia.jpg | 1 ✓ | https://cdn.tiki.vn/dac-nhan-tam.jpg | NULL | 1 |
| 2 | nha-gia-kim-bia.jpg | 1 ✓ | https://cdn.tiki.vn/nha-gia-kim.jpg | NULL | 2 |
| 3 | tu-duy-nhanh-cham.jpg | 1 ✓ | https://cdn.tiki.vn/tu-duy.jpg | NULL | 3 |
| 4 | dac-nhan-tam-chi-tiet.jpg | 0 | https://cdn.tiki.vn/dac-nhan-tam-2.jpg | NULL | 1 |
la_icon=1 làm thumbnail. Sách 1 có thêm 1 ảnh phụ (la_icon=0). Dùng URL thay vì Base64 để tiết kiệm dung lượng DB.don_hang| ma_don_hang | ngay_tao | dia_chi_nhan_hang | tong_tien_san_pham | chi_phi_giao_hang | chi_phi_thanh_toan | tong_tien | ma_nguoi_dung (FK) | ma_httt (FK) | ma_htgh (FK) |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 2025-03-22 | 456 Nguyễn Huệ, Q.1 | 161000 | 25000 | 0 | 186000 | 2 | 1 (COD) | 1 (Tiêu chuẩn) |
Tính: 89000 + 72000 = 161000 (tiền hàng) + 25000 (giao hàng) + 0 (COD) = 186000đ tổng
chi_tiet_don_hang| ma_chi_tiet_don_hang | so_luong | gia_ban (snapshot) | ma_sach (FK) | ma_don_hang (FK) |
|---|---|---|---|---|
| 1 | 1 | 89000 | 1 (Đắc Nhân Tâm) | 1 |
| 2 | 1 | 72000 | 2 (Nhà Giả Kim) | 1 |
gia_ban là giá tại thời điểm đặt — dù giá sách sau này có thay đổi, con số này vẫn giữ nguyên.su_danh_gia| ma_danh_gia | diem_xep_hang | nhan_xet | ma_sach (FK) | ma_nguoi_dung (FK) |
|---|---|---|---|---|
| 1 | 5.0 | Sách rất hay, thay đổi cách nhìn của tôi! | 1 (Đắc Nhân Tâm) | 2 (user01) |
| 2 | 4.5 | Câu chuyện đẹp, triết lý sâu sắc. | 2 (Nhà Giả Kim) | 2 (user01) |
| 3 | 4.0 | Khá hay nhưng hơi khó đọc. | 3 (Tư Duy Nhanh Chậm) | 1 (admin) |
trung_binh_xep_hang: sách 1 → 5.0, sách 2 → 4.5, sách 3 → 4.0.sach_yeu_thich| ma_sach_yeu_thich | ma_nguoi_dung (FK) | ma_sach (FK) | Ý nghĩa |
|---|---|---|---|
| 1 | 2 (user01) | 1 (Đắc Nhân Tâm) | user01 yêu thích Đắc Nhân Tâm |
| 2 | 2 (user01) | 3 (Tư Duy Nhanh Chậm) | user01 yêu thích Tư Duy Nhanh Và Chậm |
| 3 | 1 (admin) | 2 (Nhà Giả Kim) | admin yêu thích Nhà Giả Kim |
INSERT INTO the_loai (ten_the_loai) VALUES ('Văn học'), ('Kinh tế'), ('Thiếu nhi'), ('Khoa học kỹ thuật'), ('Tâm lý - Kỹ năng sống'), ('Lịch sử'), ('Ngoại ngữ');
INSERT INTO quyen (ten_quyen) VALUES ('ROLE_USER'), -- ma_quyen = 1 ('ROLE_ADMIN'); -- ma_quyen = 2
INSERT INTO hinh_thuc_thanh_toan (ten_hinh_thuc_thanh_toan, mo_ta, chi_phi_thanh_toan) VALUES ('COD', 'Thanh toán khi nhận hàng', 0), ('Thẻ tín dụng', 'Visa, Mastercard', 15000), ('Ví MoMo', 'Thanh toán qua ví điện tử MoMo', 10000), ('Chuyển khoản', 'Internet Banking', 0);
INSERT INTO hinh_thuc_giao_hang (ten_hinh_thuc_giao_hang, mo_ta, chi_phi_giao_hang) VALUES ('Giao hàng tiêu chuẩn', '3-5 ngày làm việc', 25000), ('Giao hàng nhanh', '1-2 ngày làm việc', 35000), ('Hỏa tốc', 'Giao trong ngày', 50000);
-- Giả sử user admin có ma_nguoi_dung = 1 INSERT INTO nguoidung_quyen (ma_nguoi_dung, ma_quyen) VALUES (1, 1), -- Gán ROLE_USER (1, 2); -- Gán ROLE_ADMIN
-- Gán thể loại cho sách (VD: sách 1 thuộc thể loại 1 và 5) INSERT INTO sach_theloai (ma_sach, ma_the_loai) VALUES (1, 1), (1, 5);
-- Cập nhật điểm trung bình cho tất cả sách UPDATE sach s SET trung_binh_xep_hang = ( SELECT COALESCE(AVG(diem_xep_hang), 0) FROM su_danh_gia WHERE ma_sach = s.ma_sach );