📑 Mục Lục
- Tại sao Mô Hình Bảng lại quan trọng
- Mô Hình Bảng là gì?
- Phân Tích: Văn Phòng Trường Học
- Ví Dụ Python: Bảng Đơn Hàng
- Khi nào nên sử dụng & Khi nào nên tránh
- Những điều thú vị & Khuyến nghị
- GitHub Repo + Tự Động Hóa
- Kết luận
🔥 Tại sao Mô Hình Bảng lại quan trọng
Trong các ứng dụng doanh nghiệp, logic kinh doanh có thể nằm ở nhiều nơi khác nhau:
- Trong cơ sở dữ liệu (các thủ tục lưu trữ).
- Trong mô hình miền (một lớp cho mỗi hàng).
- Hoặc trong một mô hình bảng: một lớp cho mỗi bảng.
👉 Mô Hình Bảng giữ tất cả các quy tắc cho một bảng ở một nơi duy nhất, giúp mã dễ đọc và bảo trì khi logic đơn giản.
📖 Mô Hình Bảng là gì?
Định nghĩa:
Một lớp duy nhất xử lý logic kinh doanh cho tất cả các hàng trong một bảng hoặc chế độ xem cơ sở dữ liệu.
⚖️ Sự khác biệt với Mô Hình Miền:
- Mô Hình Miền → 1 lớp cho mỗi hàng.
- Mô Hình Bảng → 1 lớp cho mỗi bảng.
🧩 Phân Tích: Văn Phòng Trường Học
Hãy tưởng tượng một văn phòng thư ký trường học:
- Thay vì mỗi giáo viên quản lý điểm danh (Mô Hình Miền),
- Văn phòng quản lý hồ sơ điểm danh cho toàn bộ trường (Mô Hình Bảng).
📌 Trung tâm, nhất quán và đơn giản.
💻 Ví Dụ Python: Bảng Đơn Hàng
❌ Không có Mô Hình Bảng (logic lộn xộn)
python
import sqlite3
conn = sqlite3.connect(":memory:")
cursor = conn.cursor()
cursor.execute("CREATE TABLE orders (id INTEGER, customer TEXT, total REAL)")
cursor.executemany("INSERT INTO orders VALUES (?, ?, ?)", [
(1, "Alice", 120.0),
(2, "Bob", 80.5),
(3, "Alice", 45.0)
])
# Logic bị phân tán khắp nơi 😓
cursor.execute("SELECT SUM(total) FROM orders WHERE customer='Alice'")
print("Tổng của Alice:", cursor.fetchone()[0])
❌ Vấn đề: Logic bị rải rác trong các truy vấn SQL khắp ứng dụng.
✅ Với Mô Hình Bảng
python
import sqlite3
class OrdersTable:
def __init__(self, connection):
self.conn = connection
def total_sales(self):
cursor = self.conn.cursor()
cursor.execute("SELECT SUM(total) FROM orders")
return cursor.fetchone()[0]
def sales_by_customer(self, customer):
cursor = self.conn.cursor()
cursor.execute("SELECT SUM(total) FROM orders WHERE customer=?", (customer,))
return cursor.fetchone()[0]
# Thiết lập cơ sở dữ liệu
conn = sqlite3.connect(":memory:")
cursor = conn.cursor()
cursor.execute("CREATE TABLE orders (id INTEGER, customer TEXT, total REAL)")
cursor.executemany("INSERT INTO orders VALUES (?, ?, ?)", [
(1, "Alice", 120.0),
(2, "Bob", 80.5),
(3, "Alice", 45.0)
])
# Sử dụng
orders = OrdersTable(conn)
print("Tổng doanh thu:", orders.total_sales())
print("Doanh thu của Alice:", orders.sales_by_customer("Alice"))
✅ SRP: Tất cả logic kinh doanh nằm trong OrdersTable.
✅ Tái sử dụng: Phương thức tập trung.
✅ KISS: Đơn giản và sạch sẽ.
🤔 Khi nào nên sử dụng & Khi nào nên tránh
✅ Sử dụng Mô Hình Bảng khi:
- Quy tắc kinh doanh đơn giản.
- Bạn cần báo cáo hoặc tổng hợp.
- Bảng là đơn vị công việc chính.
❌ Tránh khi:
- Mỗi hàng có hành vi phức tạp.
- Bạn cần đa hình → ưu tiên Mô Hình Miền.
🧠 Những điều thú vị & Khuyến nghị
💡 Bạn có biết?
- Mô Hình Bảng là một bước tiến trước khi có các ORM hiện đại như SQLAlchemy hay Django ORM.
- Nhiều ứng dụng kế thừa vẫn ẩn Mô Hình Bảng bên trong các thủ tục lưu trữ.
- Fowler khuyến nghị nó cho các hệ thống báo cáo.
👉 Mẹo chuyên nghiệp: Sử dụng Mô Hình Bảng cho các ứng dụng tập trung vào dữ liệu, Mô Hình Miền cho các ứng dụng giàu hành vi.
📦 GitHub Repo + Tự Động Hóa
Cấu trúc Repo:
plaintext
enterprise-table-module/
├─ table_module.py
├─ tests/
│ └─ test_table_module.py
├─ requirements.txt
└─ .github/
└─ workflows/
└─ ci.yml
requirements.txt
plaintext
pytest==8.3.3
.github/workflows/ci.yml
yaml
name: Python CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- run: pip install -r requirements.txt
- run: pytest
🔗 Ví dụ GitHub Repository
🎯 Kết luận
Mô Hình Bảng là một cách mạnh mẽ nhưng ít được chú ý để cấu trúc các ứng dụng doanh nghiệp khi logic đơn giản và tập trung vào bảng.
✨ Hãy nhớ:
- Sử dụng nó cho báo cáo và tổng hợp.
- Chuyển sang Mô Hình Miền khi quy tắc trở nên phức tạp.
✍️ Đến lượt bạn! Bạn sẽ sử dụng Mô Hình Bảng trong dự án tiếp theo của mình chứ?
Hãy cho tôi biết trong phần bình luận 👇