104 lines
3.4 KiB
Markdown
104 lines
3.4 KiB
Markdown
## 3.11.15. Database Schema Requirements
|
|
|
|
### 3.11.15.1. Counter Table Schema
|
|
|
|
ตาราง `document_number_counters` ต้องมีโครงสร้างดังนี้:
|
|
|
|
```sql
|
|
CREATE TABLE document_number_counters (
|
|
project_id INT NOT NULL,
|
|
originator_organization_id INT NOT NULL,
|
|
recipient_organization_id INT NULL, -- NULL for RFA
|
|
correspondence_type_id INT NOT NULL,
|
|
sub_type_id INT DEFAULT 0, -- for TRANSMITTAL
|
|
rfa_type_id INT DEFAULT 0, -- for RFA
|
|
discipline_id INT DEFAULT 0, -- for RFA
|
|
current_year INT NOT NULL,
|
|
version INT DEFAULT 0 NOT NULL, -- Optimistic Lock
|
|
last_number INT DEFAULT 0,
|
|
|
|
PRIMARY KEY (
|
|
project_id,
|
|
originator_organization_id,
|
|
COALESCE(recipient_organization_id, 0),
|
|
correspondence_type_id,
|
|
sub_type_id,
|
|
rfa_type_id,
|
|
discipline_id,
|
|
current_year
|
|
),
|
|
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (originator_organization_id) REFERENCES organizations(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (recipient_organization_id) REFERENCES organizations(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (correspondence_type_id) REFERENCES correspondence_types(id) ON DELETE CASCADE
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci
|
|
COMMENT = 'ตารางเก็บ Running Number Counters';
|
|
```
|
|
|
|
### 3.11.15.2. Index Requirements
|
|
|
|
```sql
|
|
-- Index สำหรับ Performance
|
|
CREATE INDEX idx_counter_lookup
|
|
ON document_number_counters (
|
|
project_id,
|
|
correspondence_type_id,
|
|
current_year
|
|
);
|
|
|
|
-- Index สำหรับ Originator lookup
|
|
CREATE INDEX idx_counter_org
|
|
ON document_number_counters (
|
|
originator_organization_id,
|
|
current_year
|
|
);
|
|
```
|
|
|
|
### 3.11.15.3. Important Notes
|
|
|
|
> **💡 Counter Key Design**
|
|
> - ใช้ `COALESCE(recipient_organization_id, 0)` ใน Primary Key เพื่อรองรับ NULL
|
|
> - `version` column สำหรับ Optimistic Locking (ป้องกัน race condition)
|
|
> - `last_number` เริ่มจาก 0 และเพิ่มขึ้นทีละ 1
|
|
> - Counter reset ทุกปี (เมื่อ `current_year` เปลี่ยน)
|
|
|
|
> **⚠️ Migration Notes**
|
|
> - ไม่มีข้อมูลเก่า ไม่ต้องทำ backward compatibility
|
|
> - สามารถสร้าง table ใหม่ได้เลยตาม schema ข้างต้น
|
|
> - ต้องมี seed data สำหรับ `correspondence_types`, `rfa_types`, `disciplines` ก่อน
|
|
|
|
### 3.11.15.4. Example Counter Records
|
|
|
|
```sql
|
|
-- Example: LETTER from คคง. to สคฉ.3 in LCBP3-C2 year 2025
|
|
INSERT INTO document_number_counters (
|
|
project_id, originator_organization_id, recipient_organization_id,
|
|
correspondence_type_id, sub_type_id, rfa_type_id, discipline_id,
|
|
current_year, version, last_number
|
|
) VALUES (
|
|
2, -- LCBP3-C2
|
|
22, -- คคง.
|
|
10, -- สคฉ.3
|
|
6, -- LETTER
|
|
0, 0, 0,
|
|
2025, 0, 0
|
|
);
|
|
|
|
-- Example: RFA from ผรม.2 in LCBP3-C2, discipline TER, type RPT, year 2025
|
|
INSERT INTO document_number_counters (
|
|
project_id, originator_organization_id, recipient_organization_id,
|
|
correspondence_type_id, sub_type_id, rfa_type_id, discipline_id,
|
|
current_year, version, last_number
|
|
) VALUES (
|
|
2, -- LCBP3-C2
|
|
42, -- ผรม.2
|
|
NULL, -- RFA ไม่มี specific recipient
|
|
1, -- RFA
|
|
0,
|
|
18, -- RPT (Report)
|
|
5, -- TER (Terminal)
|
|
2025, 0, 0
|
|
);
|
|
```
|