> For the complete documentation index, see [llms.txt](https://learnsql.gitbook.io/lernmysql/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learnsql.gitbook.io/lernmysql/chuan-hoa-normalization/chua-bai-thuc-hanh-3.md).

# Chữa bài Thực Hành 3

Tôi thiết kế Quản lý công việc (TODO): Trường hợp giao task cho 1 người chỉ làm 1 dự án users: id, name tasks: id,title,user\_id status: id,is\_active,task\_id Trường hợp giao task cho 1 dự án có nhiều người users: id, name tasks: id,title status: id,is\_active,user\_id,task\_id

Mình review thẳng theo kiểu “đi làm thật” nhé:\
👉 Bạn **đã hiểu đúng vấn đề (1 người vs nhiều người)**, nhưng cách thiết kế hiện tại **chưa chuẩn DB design**, đặc biệt là bảng `status`.

***

## ❌ PHÂN TÍCH THIẾT KẾ CỦA BẠN

### 🧩 Case 1: 1 task → 1 user

```
users: id, name
tasks: id, title, user_id
status: id, is_active, task_id
```

#### ⚠️ Vấn đề:

#### 1. ❌ Sai bản chất của `status`

* `status` KHÔNG phải là bảng riêng

👉 Đây chỉ là **thuộc tính của task**

***

#### 2. ❌ `is_active` quá nghèo nàn

👉 Task không chỉ có:

```
true / false
```

👉 Mà phải là:

```
todo
in_progress
done
blocked
```

***

### 🧩 Case 2: 1 task → nhiều user

```
users
tasks
status: user_id, task_id
```

#### ⚠️ Vấn đề:

#### ❌ Bạn đang dùng `status` làm bảng trung gian 😅

👉 Nhưng:

* tên sai
* thiếu dữ liệu
* sai concept

***

## 🧠 TƯ DUY CHUẨN (QUAN TRỌNG NHẤT)

### 1. Status là gì?

👉 Là **state của task**, không phải entity độc lập

***

### 2. Khi nào cần bảng trung gian?

👉 Khi:

* many-to-many

Ở đây:

* 1 task → nhiều user
* 1 user → nhiều task

👉 => cần bảng trung gian riêng

***

## ✅ THIẾT KẾ CHUẨN (CẢ 2 CASE)

***

## 🎯 CASE 1: 1 TASK → 1 USER

```
users
- id
- name

tasks
- id
- title
- user_id (FK)
- status
```

***

### 💡 SQL gợi ý

```
tasks
- status ENUM('todo','in_progress','done','blocked')
```

***

## 🎯 CASE 2: 1 TASK → NHIỀU USER (REAL-WORLD)

```
users
- id
- name

tasks
- id
- title
- status

task_assignments
- id
- task_id (FK)
- user_id (FK)
```

***

## 🔥 GIẢI THÍCH

### 🎯 Vì sao cần `task_assignments`?

👉 Vì:

* many-to-many
* mỗi task có nhiều người
* mỗi người có nhiều task

***

## 💎 LEVEL UP (RẤT QUAN TRỌNG)

### Thực tế production sẽ như này:

```
tasks
- id
- title
- description
- status
- created_at
- due_date
```

***

### Nếu muốn xịn hơn:

```
task_assignments
- task_id
- user_id
- assigned_at
- role (owner, member)
```

***

## 🔥 SO SÁNH NHANH

| Thiết kế                          | Đúng/Sai |
| --------------------------------- | -------- |
| status là bảng riêng              | ❌ Sai    |
| status là field                   | ✅ Đúng   |
| many-to-many dùng bảng trung gian | ✅ Đúng   |
| dùng status làm bảng trung gian   | ❌ Sai    |
