Trong một hệ thống website bán hàng, cơ sở dữ liệu là thành phần cốt lõi giúp lưu trữ toàn bộ thông tin về người dùng, sản phẩm, đơn hàng, giao dịch và nhiều phân hệ chức năng khác. Một hệ thống quản lý dữ liệu tốt sẽ giúp việc vận hành trở nên trơn tru, giảm thiểu lỗi phát sinh và dễ dàng mở rộng khi cần thiết. Ở bài viết này, chúng ta sẽ cùng phân tích kiến trúc cơ sở dữ liệu của hệ thống Shop-main và làm rõ các mối quan hệ giữa các bảng.
Hệ thống Shop-main sử dụng cơ sở dữ liệu quan hệ, điển hình là MySQL. Dữ liệu được tổ chức theo mô hình chuẩn hóa, phân chia thành các bảng riêng biệt đại diện cho từng thực thể, đồng thời liên kết với nhau thông qua các khóa ngoại để đảm bảo tính toàn vẹn và khả năng truy xuất thuận tiện. Tùy vào đặc điểm nghiệp vụ, một số bảng có quan hệ một – một, một – nhiều, hoặc nhiều – nhiều.
Ví dụ điển hình là mối quan hệ giữa bảng người dùng và bảng vai trò. Mỗi người dùng có thể đảm nhận nhiều vai trò khác nhau như khách hàng, nhân viên kho, hoặc quản trị viên. Do đó, hệ thống thiết lập bảng trung gian để liên kết người dùng với vai trò, từ đó hình thành mối quan hệ nhiều – nhiều. Trong khi đó, mỗi người dùng lại có thông tin thiết lập cá nhân riêng biệt, như địa chỉ mặc định hay hình đại diện, được lưu trong một bảng khác có quan hệ một – một với bảng người dùng chính.
STT | Tên bảng | Mô tả chức năng | Khóa chính | Khóa ngoại | Quan hệ |
---|
1 | users | Quản lý thông tin người dùng (khách, admin, nhân viên) | id | — | 1–1, 1–n |
2 | roles | Vai trò người dùng (admin, kho, khách hàng, v.v.) | id | — | n–n (qua pivot) |
3 | user_roles | Bảng trung gian giữa users và roles | id | user_id , role_id | n–n |
4 | user_settings | Cài đặt cá nhân người dùng | id | user_id | 1–1 với users |
5 | products | Quản lý sản phẩm | id | cat_id , brand_id | 1–n |
6 | product_extend | Thuộc tính mở rộng của sản phẩm (giá, màu, thông số...) | id | product_id | 1–1 |
7 | categories | Danh mục sản phẩm | id | — | 1–n |
8 | brands | Thương hiệu sản phẩm | id | — | 1–n |
9 | tag_product | Thẻ (tag) sản phẩm | id | product_id , tag_id | n–n |
10 | tags | Danh sách các tag (phân loại đặc biệt) | id | — | n–n (qua bảng phụ) |
11 | orders | Đơn đặt hàng của người dùng | id | user_id , wh_id , status_id | 1–n |
12 | order_details | Chi tiết sản phẩm trong đơn hàng | id | order_id , product_id | 1–n |
13 | payments | Giao dịch thanh toán (VNPAY, SEPAY) | id | order_id , user_id , gateway_id | 1–n |
14 | gateways | Danh sách các cổng thanh toán hỗ trợ | id | — | 1–n |
15 | warehouses | Danh sách kho hàng | id | — | 1–n |
16 | warehousein | Phiếu nhập kho | id | wh_id , user_id , supplier_id | 1–n |
17 | warehousein_detail | Chi tiết phiếu nhập kho | id | warehousein_id , product_id | 1–n |
18 | warehouseout | Phiếu xuất kho | id | wh_id , user_id , reason_id | 1–n |
19 | warehouseout_detail | Chi tiết phiếu xuất kho | id | warehouseout_id , product_id | 1–n |
20 | inventory_logs | Nhật ký kiểm kê kho | id | wh_id , user_id | 1–n |
21 | suppliers | Nhà cung cấp | id | — | 1–n |
22 | transactions | Quản lý giao dịch tài chính | id | user_id , order_id , type_id | 1–n |
23 | cashbook | Phiếu nhập quỹ / xuất quỹ | id | user_id , type | 1–n |
24 | blogs | Bài viết blog, tin tức | id | user_id , cat_id | 1–n |
25 | tag_blog | Gắn thẻ vào bài viết | id | blog_id , tag_id | n–n |
26 | blog_comments | Bình luận bài viết | id | blog_id , user_id , parent_id | 1–n |
27 | returns | Phiếu trả hàng | id | order_id , user_id , type | 1–n |
28 | warranties | Thông tin bảo hành sản phẩm | id | product_id , user_id , order_id | 1–n |
Ghi chú
- 1–1: Quan hệ một – một (ví dụ:
user
và user_settings
) - 1–n: Quan hệ một – nhiều (ví dụ:
category
chứa nhiều product
) - n–n: Quan hệ nhiều – nhiều thông qua bảng phụ (pivot table)
- Một số bảng có thêm các cột như
created_at
, updated_at
, deleted_at
để hỗ trợ quản lý dữ liệu theo chuẩn Laravel Eloquent
Bên cạnh đó, hệ thống sản phẩm cũng được thiết kế theo hướng linh hoạt, có thể mở rộng. Mỗi sản phẩm thuộc một danh mục cụ thể và có thể gắn với một thương hiệu nhất định. Ngoài ra, sản phẩm còn có thể có các thuộc tính bổ sung như màu sắc, kích thước, mã SKU, và được tổ chức trong một bảng mở rộng để không làm phình to bảng chính. Trong trường hợp cần lọc theo thẻ sản phẩm, một bảng trung gian giúp kết nối sản phẩm với các tag được định nghĩa trước, thể hiện mối quan hệ nhiều – nhiều.
Đối với quy trình bán hàng, mỗi đơn hàng do người dùng tạo ra sẽ được lưu vào bảng đơn hàng chính. Mỗi đơn có thể chứa nhiều mặt hàng khác nhau, vì vậy cần một bảng chi tiết đơn hàng để lưu từng sản phẩm được đặt kèm theo số lượng, giá và tổng tiền. Đơn hàng cũng liên kết với bảng trạng thái giao dịch để biết đơn đã được xác nhận, thanh toán hay hủy. Đồng thời, hệ thống còn có bảng ghi nhận lịch sử thanh toán, bảng liên kết giao dịch với các cổng như VNPAY hoặc SEPAY.
Một số phân hệ đặc biệt như nhập kho, xuất kho, nhập quỹ hoặc kiểm kê cũng có thiết kế riêng với cấu trúc tách bảng phiếu chính và bảng chi tiết. Cách thiết kế này giúp hệ thống dễ kiểm soát dữ liệu theo nhóm phiếu, tránh trùng lặp và đảm bảo có thể dễ dàng tính toán khi tạo báo cáo.
Để thiết kế mô hình dữ liệu chuẩn xác, bạn nên sử dụng các công cụ như MySQL Workbench hoặc Draw.io để xây dựng sơ đồ quan hệ thực thể. Việc biểu diễn các bảng và mối quan hệ trên sơ đồ sẽ giúp bạn dễ nhìn, dễ kiểm soát và phát hiện ra những mối quan hệ còn thiếu hoặc chưa hợp lý. Ngoài ra, trong quá trình xây dựng hệ thống bằng Laravel, các mối quan hệ này sẽ được ánh xạ thành các model với các hàm như belongsTo, hasMany hoặc belongsToMany để xử lý truy vấn một cách tối ưu.
Tóm lại, việc thiết kế cơ sở dữ liệu không chỉ là bước kỹ thuật mà còn phản ánh trực tiếp hiểu biết nghiệp vụ của bạn đối với hệ thống. Một mô hình dữ liệu chặt chẽ sẽ giúp quá trình xây dựng hệ thống sau này trở nên dễ dàng hơn rất nhiều, đồng thời hạn chế tối đa lỗi trong lưu trữ và truy xuất thông tin. Ở các bài viết tiếp theo, chúng ta sẽ đi sâu vào từng quy trình nghiệp vụ cụ thể như nhập hàng, bán hàng, kiểm kê và thanh toán.