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ệ.

🗺️
Thứ Tự Nhập Dữ Liệu (Quan Trọng!)

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:

1
the_loaiKhông có FK
2
quyenKhông có FK
3
hinh_thuc_thanh_toanKhông có FK
4
hinh_thuc_giao_hangKhông có FK
5
nguoi_dungKhông có FK trực tiếp
6
nguoidung_quyenFK: nguoi_dung, quyen
7
sachKhông có FK trực tiếp
8
sach_theloaiFK: sach, the_loai
9
hinh_anhFK: sach
10
don_hangFK: nguoi_dung, httt, htgh
11
chi_tiet_don_hangFK: sach, don_hang
12
su_danh_giaFK: sach, nguoi_dung
13
sach_yeu_thichFK: sach, nguoi_dung
🏷️
1. TheLoai – Thể Loại Sách
🏷️

TheLoai

Bảng: the_loai | Quan hệ: N-M với Sach
Cột DBField JavaKiểuBắt buộcÝ nghĩa
ma_the_loaimaTheLoaiPK AUTOTự động tăng, không cần nhập
ten_the_loaitenTheLoaiVARCHAR(256)✓ Bắt buộcTên thể loại: "Văn học", "Khoa học"…
💡 Cách thu thập dữ liệu
  • 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
🔑
2. Quyen – Quyền Truy Cập
🔑

Quyen

Bảng: quyen | Quan hệ: N-M với NguoiDung
Cột DBField JavaKiểuBắt buộcÝ nghĩa
ma_quyenmaQuyenPK AUTOTự động tăng
ten_quyentenQuyenVARCHAR✓ Bắt buộcTên quyền, bắt đầu bằng ROLE_
⚠️ Quy tắc đặt tên bắt buộc

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_USERROLE_ADMIN.

💳
3. HinhThucThanhToan – Hình Thức Thanh Toán
💳

HinhThucThanhToan

Bảng: hinh_thuc_thanh_toan | Quan hệ: 1-N với DonHang
Cột DBField JavaKiểuBắt buộcÝ nghĩa
ma_hinh_thuc_thanh_toanmaHinhThucThanhToanPK AUTOTự động tăng
ten_hinh_thuc_thanh_toantenHinhThucThanhToanVARCHARTên hình thức: "COD", "Thẻ tín dụng"…
mo_tamoTaVARCHARTùy chọnMô tả thêm về hình thức
chi_phi_thanh_toanchiPhiThanhToanDOUBLEPhí thanh toán (VD: 0, 10000, 15000)
💡 Dữ liệu mẫu gợi ý
  • 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đ
🚚
4. HinhThucGiaoHang – Hình Thức Giao Hàng
🚚

HinhThucGiaoHang

Bảng: hinh_thuc_giao_hang | Quan hệ: 1-N với DonHang
Cột DBField JavaKiểuBắt buộcÝ nghĩa
ma_hinh_thuc_giao_hangmaHinhThucGiaoHangPK AUTOTự động tăng
ten_hinh_thuc_giao_hangtenHinhThucGiaoHangVARCHARTên: "Giao hàng tiêu chuẩn", "Giao nhanh"…
mo_tamoTaVARCHARTùy chọnMô tả thêm, VD: "3-5 ngày làm việc"
chi_phi_giao_hangchiPhiGiaoHangDOUBLEPhí vận chuyển (VD: 25000, 35000)
💡 Dữ liệu mẫu gợi ý
  • 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đ
👤
5. NguoiDung – Người Dùng
👤

NguoiDung

Bảng: nguoi_dung | Quan hệ: N-M với Quyen 1-N với DonHang, SuDanhGia, SachYeuThich
Cột DBField JavaKiểuBắt buộcÝ nghĩa
ma_nguoi_dungmaNguoiDungPK AUTOTự động tăng
ho_demhoDemVARCHARHọ và tên đệm, VD: "Nguyễn Văn"
tentenVARCHARTên, VD: "An"
ten_dang_nhaptenDangNhapVARCHAR✓ UniqueUsername đăng nhập, không trùng
mat_khaumatKhauVARCHAR(512)Mật khẩu đã BCrypt hash (không nhập plain text)
gioi_tinhgioiTinhVARCHARTùy chọn"Nam", "Nữ", "Khác"
emailemailVARCHAR✓ UniqueEmail, phải duy nhất
so_dien_thoaisoDienThoaiVARCHARTùy chọnSố điện thoại liên hệ
dia_chi_mua_hangdiaChiMuaHangVARCHARTùy chọnĐịa chỉ thanh toán/hóa đơn
dia_chi_giao_hangdiaChiGiaoHangVARCHARTùy chọnĐịa chỉ nhận hàng mặc định
⚠️ Mật khẩu phải được mã hóa BCrypt!

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.

💡 Cách tạo dữ liệu nhanh
  • Dùng Postman gọi POST /tai-khoan/dang-ky vớ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
📚
6. Sach – Sách
📚

Sach

Bảng: sach | Quan hệ: N-M với TheLoai 1-N với HinhAnh, SuDanhGia, SachYeuThich, ChiTietDonHang
Cột DBField JavaKiểuBắt buộcÝ nghĩa
ma_sachmaSachPK AUTOTự động tăng
ten_sachtenSachVARCHAR(256)Tên đầy đủ của sách
ten_tac_giatenTacGiaVARCHAR(256)Họ tên tác giả
isbnISBNVARCHAR(256)Tùy chọnMã sách quốc tế, 13 chữ số (ISBN-13)
mo_tamoTaTEXTTùy chọnMô tả ngắn, tóm tắt nội dung sách
thong-tin-chi-tietthongTinChiTietTEXTTùy chọnThông tin chi tiết: số trang, NXB, năm XB…
gia_niem_yetgiaNiemYetDOUBLEGiá bìa gốc (VD: 120000)
gia_bangiaBanDOUBLEGiá bán thực tế (có thể thấp hơn giá bìa)
so_luongsoLuongINTSố lượng tồn kho
trung_binh_xep_hangtrungBinhXepHangDOUBLETùy chọnĐiểm đánh giá trung bình (0.0 – 5.0), mặc định 0
💡 Nguồn thu thập dữ liệu sách
  • 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_hang nên để 0, sẽ được cập nhật khi có đánh giá
🖼️
7. HinhAnh – Hình Ảnh Sách
🖼️

HinhAnh

Bảng: hinh_anh | Quan hệ: N-1 với Sach
Cột DBField JavaKiểuBắt buộcÝ nghĩa
ma_hinh_anhmaHinhAnhPK AUTOTự động tăng
ten_hinh_anhtenHinAnhVARCHAR(256)Tùy chọnTên file ảnh, VD: "bia-truoc.jpg"
la_iconlaIconTINYINT (bool)1 = ảnh đại diện chính (thumbnail), 0 = ảnh phụ
duong_danduongDanVARCHARTùy chọnURL ảnh online, VD: "https://cdn.../anh.jpg"
du_lieu_anhduLieuAnhLONGTEXTTùy chọnẢnh dạng Base64 (nếu không dùng URL)
ma_sachsachFK → sach✓ NOT NULLSách mà ảnh này thuộc về
⚠️ Chỉ dùng một trong hai: duong_dan hoặc du_lieu_anh

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.

🛒
8. DonHang – Đơn Hàng
🛒

DonHang

Bảng: don_hang | Quan hệ: N-1 với NguoiDung, HinhThucThanhToan, HinhThucGiaoHang 1-N với ChiTietDonHang
Cột DBField JavaKiểuBắt buộcÝ nghĩa
ma_don_hangmaDonHangPK AUTOTự động tăng
ngay_taongayTaoDATE/DATETIMENgày đặt hàng, VD: 2025-03-22
dia_chi_mua_hangdiaChiMuaHangVARCHAR(512)Tùy chọnĐịa chỉ xuất hóa đơn
dia_chi_nhan_hangdiaChiNhanHangVARCHAR(512)Tùy chọnĐịa chỉ giao hàng
tong_tien_san_phamtongTienSanPhamDOUBLETổng tiền hàng (chưa gồm phí)
chi_phi_giao_hangchiPhiGiaoHangDOUBLEPhí vận chuyển (lấy từ HinhThucGiaoHang)
chi_phi_thanh_toanchiPhiThanhToanDOUBLEPhí thanh toán (lấy từ HinhThucThanhToan)
tong_tientongTienDOUBLETổng thanh toán = tiền hàng + phí GH + phí TT
ma_nguoi_dungnguoiDungFK → nguoi_dung✓ NOT NULLNgười đặt hàng
ma_hinh_thuc_thanh_toanhinhThucThanhToanFK → htttnullablePhương thức thanh toán được chọn
ma_hinh_thuc_giao_hanghinhThucGiaoHangFK → htghnullablePhương thức vận chuyển được chọn
💡 Lưu ý tính toán tổng tiề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.

📋
9. ChiTietDonHang – Chi Tiết Đơn Hàng
📋

ChiTietDonHang

Bảng: chi_tiet_don_hang | Quan hệ: N-1 với Sach, DonHang
Cột DBField JavaKiểuBắt buộcÝ nghĩa
ma_chi_tiet_don_hangmaChiTietDonHangPK AUTOTự động tăng (kiểu long)
so_luongsoLuongINTSố lượng quyển đặt mua
gia_bangiaBanDOUBLEGiá tại thời điểm đặt hàng (snapshot giá)
ma_sachsachFK → sach✓ NOT NULLSách được đặt mua
ma_don_hangdonHangFK → don_hang✓ NOT NULLĐơn hàng chứa dòng này
⚠️ Lưu giá tại thời điểm mua

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.

10. SuDanhGia – Đánh Giá Sách

SuDanhGia

Bảng: su_danh_gia | Quan hệ: N-1 với Sach, NguoiDung
Cột DBField JavaKiểuBắt buộcÝ nghĩa
ma_danh_giamaDanhGiaPK AUTOTự động tăng (kiểu long)
diem_xep_hangdiemXepHangFLOATĐiểm 1.0 – 5.0, VD: 4.5
nhan_xetnhanXetVARCHARTùy chọnNhận xét dạng text tự do
ma_sachsachFK → sach✓ NOT NULLSách được đánh giá
ma_nguoi_dungnguoiDungFK → nguoi_dung✓ NOT NULLNgười viết đánh giá
💡 Sau khi thêm đá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 = ?

❤️
11. SachYeuThich – Sách Yêu Thích
❤️

SachYeuThich

Bảng: sach_yeu_thich | Quan hệ: N-1 với Sach, NguoiDung
Cột DBField JavaKiểuBắt buộcÝ nghĩa
ma_sach_yeu_thichmaSachYeuThichPK AUTOTự động tăng
ma_nguoi_dungnguoiDungFK → nguoi_dung✓ NOT NULLNgười đã yêu thích sách
ma_sachsachFK → sach✓ NOT NULLSách được yêu thích
📊
Data Mẫu Chi Tiết — Kịch Bản Thực Tế

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ệ.

🏷️ Bảng the_loai
ma_the_loaiten_the_loai
1Văn học
2Tâm lý - Kỹ năng sống
3Kinh tế
4Thiếu nhi
5Khoa học kỹ thuật
🔑 Bảng quyen
ma_quyenten_quyen
1ROLE_USER
2ROLE_ADMIN
💳 Bảng hinh_thuc_thanh_toan
ma_hinh_thuc_thanh_toanten_hinh_thuc_thanh_toanmo_tachi_phi_thanh_toan
1CODThanh toán khi nhận hàng0
2Thẻ tín dụngVisa, Mastercard15000
3Ví MoMoVí điện tử MoMo10000
🚚 Bảng hinh_thuc_giao_hang
ma_hinh_thuc_giao_hangten_hinh_thuc_giao_hangmo_tachi_phi_giao_hang
1Giao hàng tiêu chuẩn3-5 ngày làm việc25000
2Giao hàng nhanh1-2 ngày làm việc35000
3Hỏa tốcGiao trong ngày50000
👤 Bảng nguoi_dung
ma_nguoi_dungho_demtenten_dang_nhapmat_khau (BCrypt)gioi_tinhemailso_dien_thoaidia_chi_giao_hang
1Nguyễn VănAnadmin$2a$10$hash... (plain: 123456)Namadmin@gmail.com0901234567123 Lê Lợi, Q.1, TP.HCM
2Trần ThịBìnhuser01$2a$10$hash... (plain: abc123)Nữbinh@gmail.com0912345678456 Nguyễn Huệ, Q.1, TP.HCM
⚠️ Cột 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$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
🔗 Bảng trung gian nguoidung_quyen
ma_nguoi_dungma_quyenÝ nghĩa
11admin → ROLE_USER
12admin → ROLE_ADMIN
21user01 → ROLE_USER
User ID=1 (admin) có cả 2 quyền. User ID=2 chỉ có ROLE_USER nên không truy cập được /nguoi-dung.
📚 Bảng sach
ma_sachten_sachten_tac_giaisbngia_niem_yetgia_banso_luongtrung_binh_xep_hang
1Đắc Nhân TâmDale Carnegie9780671027032120000890001504.8
2Nhà Giả KimPaulo Coelho97860411825239500072000804.6
3Tư Duy Nhanh Và ChậmDaniel Kahneman9786041060715180000140000454.7
Trường mo_tathong-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..."
🔗 Bảng trung gian sach_theloai
ma_sachma_the_loaiÝ nghĩa
12Đắc Nhân Tâm → Tâm lý - Kỹ năng sống
21Nhà Giả Kim → Văn học
33Tư Duy Nhanh Và Chậm → Kinh tế
35Tư Duy Nhanh Và Chậm → Khoa học kỹ thuật
Sách 3 (Tư Duy Nhanh Và Chậm) thuộc 2 thể loại — đây là ví dụ của quan hệ Many-to-Many.
🖼️ Bảng hinh_anh
ma_hinh_anhten_hinh_anhla_iconduong_dandu_lieu_anhma_sach (FK)
1dac-nhan-tam-bia.jpg1 ✓https://cdn.tiki.vn/dac-nhan-tam.jpgNULL1
2nha-gia-kim-bia.jpg1 ✓https://cdn.tiki.vn/nha-gia-kim.jpgNULL2
3tu-duy-nhanh-cham.jpg1 ✓https://cdn.tiki.vn/tu-duy.jpgNULL3
4dac-nhan-tam-chi-tiet.jpg0https://cdn.tiki.vn/dac-nhan-tam-2.jpgNULL1
Mỗi sách có đúng 1 ảnh với 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.
🛒 Bảng don_hang
ma_don_hangngay_taodia_chi_nhan_hangtong_tien_san_phamchi_phi_giao_hangchi_phi_thanh_toantong_tienma_nguoi_dung (FK)ma_httt (FK)ma_htgh (FK)
12025-03-22456 Nguyễn Huệ, Q.116100025000018600021 (COD)1 (Tiêu chuẩn)
Đơn hàng của user02 (Trần Thị Bình) mua 1 sách Đắc Nhân Tâm + 1 sách Nhà Giả Kim bằng COD, giao hàng tiêu chuẩn.
Tính: 89000 + 72000 = 161000 (tiền hàng) + 25000 (giao hàng) + 0 (COD) = 186000đ tổng
📋 Bảng chi_tiet_don_hang
ma_chi_tiet_don_hangso_luonggia_ban (snapshot)ma_sach (FK)ma_don_hang (FK)
11890001 (Đắc Nhân Tâm)1
21720002 (Nhà Giả Kim)1
2 dòng chi tiết thuộc cùng 1 đơn hàng (ma_don_hang=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.
Bảng su_danh_gia
ma_danh_giadiem_xep_hangnhan_xetma_sach (FK)ma_nguoi_dung (FK)
15.0Sách rất hay, thay đổi cách nhìn của tôi!1 (Đắc Nhân Tâm)2 (user01)
24.5Câu chuyện đẹp, triết lý sâu sắc.2 (Nhà Giả Kim)2 (user01)
34.0Khá hay nhưng hơi khó đọc.3 (Tư Duy Nhanh Chậm)1 (admin)
Sau khi thêm đánh giá, chạy UPDATE để tính lại trung_binh_xep_hang: sách 1 → 5.0, sách 2 → 4.5, sách 3 → 4.0.
❤️ Bảng sach_yeu_thich
ma_sach_yeu_thichma_nguoi_dung (FK)ma_sach (FK)Ý nghĩa
12 (user01)1 (Đắc Nhân Tâm)user01 yêu thích Đắc Nhân Tâm
22 (user01)3 (Tư Duy Nhanh Chậm)user01 yêu thích Tư Duy Nhanh Và Chậm
31 (admin)2 (Nhà Giả Kim)admin yêu thích Nhà Giả Kim
🗄️
Dữ Liệu Mẫu SQL (Chạy theo thứ tự)
1_the_loai.sql
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ữ');
2_quyen.sql
INSERT INTO quyen (ten_quyen) VALUES
('ROLE_USER'),    -- ma_quyen = 1
('ROLE_ADMIN');   -- ma_quyen = 2
3_hinh_thuc_thanh_toan.sql
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);
4_hinh_thuc_giao_hang.sql
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);
5_gán_admin.sql (sau khi tạo user qua API)
-- 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
6_sach_the_loai.sql (sau khi có sach và the_loai)
-- 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);
7_update_rating.sql (chạy sau khi thêm đánh giá)
-- 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
);
WebBanSach Backend · Entity & Database Guide · 11 Entities