NhaLapTrinh.comNhà Lập Trình
Cơ sở dữ liệu

Thiết kế bảng dữ liệu cho một cửa hàng nhỏ

Thiết kế bảng dữ liệu bắt đầu từ những thứ thật trong cửa hàng: khách, hàng, đơn, phiếu nhập. Mỗi thứ một bảng, mỗi thông tin lưu một chỗ, liên kết bằng mã. Hai chỗ hay sai nhất là giá bán phải lưu lại tại thời điểm bán, và đừng xoá hẳn dữ liệu mà hãy đánh dấu ngừng dùng.

🎙️
📑 Nội dung theo chương
  1. 0:37 Bắt đầu từ danh từ, không từ màn hình
  2. 1:24 Mỗi thông tin chỉ lưu một chỗ
  3. 2:11 Cái bẫy của giá bán
  4. 3:05 Đừng xoá hẳn, hãy đánh dấu
  5. 3:52 Những cột nhỏ mà đáng giá
  6. 4:42 Câu hỏi thường gặp
🔊 Bản audio (lồng nhạc nền)

Thiết kế bảng dữ liệu nên bắt đầu từ những thứ có thật trong cửa hàng: khách, hàng hoá, đơn bán, phiếu nhập. Mỗi thứ một bảng, mỗi mẩu thông tin chỉ lưu ở một chỗ, các bảng liên kết với nhau bằng mã. Và có hai chỗ mà người mới hay sai nhất: giá bán phải được lưu lại tại thời điểm bán, và đừng xoá hẳn dữ liệu mà hãy đánh dấu ngừng dùng.

Chào bạn, đây là Nhà Lập Trình. Thiết kế bảng dữ liệu là một trong những quyết định khó đổi nhất trong một dự án. Mã có thể sửa dần, còn cấu trúc dữ liệu đã chứa vài năm dữ liệu thật thì đổi rất đau. Tập này mình dùng ví dụ một cửa hàng nhỏ để kể cách nghĩ, không đọc lệnh nào.

Bắt đầu từ danh từ, không từ màn hình

Người mới hay thiết kế bảng theo màn hình. Màn hình bán hàng có những ô gì thì tạo một bảng có đủ những cột đó. Kết quả là một bảng khổng lồ lưu mọi thứ, giống hệt tệp bảng tính cũ.

Cách tốt hơn là bắt đầu từ danh từ, những thứ có thật trong nghiệp vụ. Ngồi với chị chủ cửa hàng, nghe chị kể một ngày làm việc, và gạch chân các danh từ: khách hàng, mặt hàng, nhà cung cấp, đơn bán, phiếu nhập, khoản thu, khoản nợ.

Mỗi danh từ quan trọng thường thành một bảng. Mỗi thuộc tính của danh từ đó thành một cột: khách hàng có tên, số điện thoại, địa chỉ. Mặt hàng có tên, đơn vị tính, giá bán hiện tại.

Rồi hỏi mối quan hệ: một khách có nhiều đơn, một đơn có nhiều dòng hàng, một mặt hàng có mặt trong nhiều đơn. Những mối quan hệ này quyết định bảng nào giữ mã của bảng nào.

Mỗi thông tin chỉ lưu một chỗ

Nguyên tắc cốt lõi là không chép thông tin. Tên khách chỉ lưu trong bảng khách hàng. Bảng đơn hàng giữ mã khách, không giữ tên. Khi cần hiện tên, ghép hai bảng lại.

Lý do là để khi thông tin thay đổi, chỉ cần sửa một chỗ, và dữ liệu không bao giờ mâu thuẫn. Người trong nghề gọi việc tách bảng như vậy là chuẩn hoá.

Mỗi bảng cần một cột làm mã định danh duy nhất cho từng dòng, gọi là khoá chính. Hãy dùng một con số tự tăng hoặc một mã do hệ thống tạo, đừng dùng những thứ có vẻ duy nhất như số điện thoại. Khách đổi số, hai người dùng chung số, người không có số, đủ kiểu chuyện xảy ra.

Bảng đơn hàng giữ mã khách, gọi là khoá ngoại. Hãy khai báo nó với cơ sở dữ liệu, để cơ sở dữ liệu tự chặn khi ai đó cố tạo đơn cho một khách không tồn tại, hay xoá một khách đang có đơn.

Cái bẫy của giá bán

Đây là lỗi mình thấy nhiều nhất ở phần mềm bán hàng do người mới viết. Bảng mặt hàng có cột giá bán. Bảng dòng đơn hàng chỉ lưu mã hàng và số lượng. Muốn biết tiền đơn, lấy số lượng nhân giá trong bảng mặt hàng.

Chạy rất tốt, cho tới khi cửa hàng tăng giá. Ngay lập tức mọi đơn hàng cũ đều bị tính lại theo giá mới. Doanh thu tháng trước tự nhiên tăng lên. Hoá đơn in lại cho khách không khớp với số tiền khách đã trả.

Cách đúng là bảng dòng đơn hàng phải lưu giá bán tại thời điểm bán. Giá trong bảng mặt hàng chỉ là giá hiện tại, dùng để gợi ý khi tạo đơn mới. Một khi đơn đã chốt, giá của nó là giá của lúc đó, không đổi theo giá hiện tại.

Điều này nghe như trái với nguyên tắc không chép thông tin. Nhưng thật ra đây là hai thông tin khác nhau: giá hiện tại và giá đã bán. Nguyên tắc tương tự áp dụng cho địa chỉ giao hàng, tên sản phẩm trên hoá đơn, mức thuế. Những gì đã thành chứng từ thì phải được đóng băng.

Đừng xoá hẳn, hãy đánh dấu

Cửa hàng ngừng bán một mặt hàng. Người mới sẽ xoá dòng đó khỏi bảng mặt hàng. Nhưng mặt hàng đó có trong hàng trăm đơn cũ. Xoá đi, những đơn cũ trỏ tới một thứ không tồn tại, báo cáo lỗi, hoặc cơ sở dữ liệu từ chối xoá vì còn liên kết.

Cách phổ biến là thêm một cột đánh dấu còn dùng hay đã ngừng. Mặt hàng ngừng bán thì đánh dấu ngừng. Màn hình tạo đơn mới không hiện nó nữa, nhưng các đơn cũ vẫn hiển thị đúng.

Tương tự với khách hàng, nhân viên, nhà cung cấp. Nhân viên nghỉ việc không xoá, vì các đơn họ đã bán vẫn cần ghi tên người bán.

Lưu ý là đánh dấu ngừng không thay thế được việc xoá thật khi có yêu cầu về quyền riêng tư. Nếu khách yêu cầu xoá thông tin cá nhân, bạn cần có cách xoá hoặc làm mờ thông tin đó mà vẫn giữ được số liệu kế toán cần thiết. Nên nghĩ tới chuyện này từ đầu.

Những cột nhỏ mà đáng giá

Có vài cột nhỏ mà bảng nào cũng nên có. Thời điểm tạo và thời điểm sửa gần nhất. Ai tạo, ai sửa. Chúng tốn rất ít chỗ, nhưng khi có sự cố, chúng là manh mối đầu tiên.

Hãy chọn kiểu dữ liệu cẩn thận. Tiền dùng số nguyên hoặc kiểu số thập phân chính xác, không dùng kiểu số thực gần đúng. Ngày dùng kiểu ngày, không lưu thành chữ. Số điện thoại lưu thành chữ, vì nó có thể bắt đầu bằng số không và không bao giờ đem đi cộng trừ.

Đặt tên bảng và cột nhất quán, theo từ ngữ của cửa hàng. Nếu chị chủ gọi là phiếu nhập, đừng gọi là bản ghi hàng về.

Và đừng thiết kế một mình. Cầm bản thiết kế, dù chỉ là mấy ô vẽ tay, ngồi với chị chủ và hỏi: một đơn có thể có hai khách không? Khách có thể trả làm nhiều lần không? Hàng có thể về từ hai nhà cung cấp không? Mỗi câu trả lời có thể đổi cả thiết kế, và đổi lúc này thì chỉ tốn một tờ giấy.

Câu hỏi thường gặp

Chuẩn hoá cơ sở dữ liệu là gì?

Là cách tổ chức dữ liệu thành nhiều bảng sao cho mỗi thông tin chỉ lưu ở một chỗ, tránh chép lặp và mâu thuẫn. Các bảng liên kết với nhau qua mã định danh.

Vì sao không nên dùng số điện thoại làm mã khách hàng?

Vì số điện thoại có thể thay đổi, có thể trùng giữa người thân, hoặc có khách không có. Mã định danh nên là giá trị do hệ thống tạo và không bao giờ đổi.

Vì sao phải lưu giá bán vào từng dòng đơn hàng?

Vì giá hàng thay đổi theo thời gian. Nếu chỉ lấy giá hiện tại, mọi đơn cũ sẽ bị tính lại theo giá mới, làm sai doanh thu và hoá đơn.

Xoá mềm dữ liệu là gì?

Là đánh dấu một dòng dữ liệu đã ngừng dùng thay vì xoá hẳn, để dữ liệu cũ liên quan vẫn hiển thị đúng. Cần cân nhắc cách xoá thật khi có yêu cầu về quyền riêng tư.

Nên lưu số tiền bằng kiểu dữ liệu nào?

Nên dùng số nguyên theo đơn vị nhỏ nhất hoặc kiểu số thập phân chính xác. Tránh kiểu số thực gần đúng vì có thể gây sai lệch nhỏ khi cộng dồn.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.