หมวดหมู่คอนเทนต์และลิงก์รวม
ภาพรวม
Domain นี้มี 3 ตาราง: content_category เก็บหมวดหมู่ระดับบนของคอนเทนต์แยกตาม LINE OA,
content_subcategory เก็บหมวดหมู่ย่อยที่รองรับโครงสร้างหลายชั้นผ่าน parent_id/level และ
content_link เก็บลิงก์รวมคอนเทนต์ (สร้างลิงก์เดียวที่ชี้ไปยังชุดคอนเทนต์ตามเงื่อนไขหมวดหมู่
และช่วงวันที่เผยแพร่) พร้อมนับจำนวนคลิก
ตาราง content_category
| Column | Type | Nullable | Default | คำอธิบาย |
|---|---|---|---|---|
id | SERIAL | NO | nextval(...) | Primary key |
uuid | UUID | NO | gen_random_uuid() | รหัสอ้างอิงภายนอกของหมวดหมู่ (unique) |
line_oa_id | INTEGER | NO | - | LINE OA ที่หมวดหมู่นี้สังกัด (FK ไป line_oa.id) |
organization_id | INTEGER | NO | - | องค์กรเจ้าของหมวดหมู่ |
name | VARCHAR(255) | NO | - | ชื่อหมวดหมู่ |
slug | VARCHAR(255) | NO | - | slug ของหมวดหมู่ใน URL |
description | TEXT | YES | - | คำอธิบายหมวดหมู่ |
thumbnail | VARCHAR(500) | YES | - | URL รูปภาพประจำหมวดหมู่ |
sort_order | INTEGER | NO | 0 | ลำดับการแสดงผล |
status | ContentCategoryStatus (ENUM) | NO | active | สถานะ: active, inactive, delete |
created_date | TIMESTAMPTZ(3) | NO | now() | วันเวลาที่สร้าง |
created_by | INTEGER | NO | 0 | ผู้สร้าง (user id) |
updated_date | TIMESTAMPTZ(3) | NO | now() | วันเวลาที่แก้ไขล่าสุด |
updated_by | INTEGER | NO | 0 | ผู้แก้ไขล่าสุด (user id) |
deleted_date | TIMESTAMPTZ(3) | YES | - | วันเวลาที่ลบ (soft delete) |
ตาราง content_subcategory
| Column | Type | Nullable | Default | คำอธิบาย |
|---|---|---|---|---|
id | SERIAL | NO | nextval(...) | Primary key |
uuid | UUID | NO | gen_random_uuid() | รหัสอ้างอิงภายนอกของหมวดหมู่ย่อย (unique) |
category_id | INTEGER | NO | - | หมวดหมู่แม่ (FK ไป content_category.id) |
line_oa_id | INTEGER | NO | - | LINE OA ที่หมวดหมู่ย่อยนี้สังกัด |
organization_id | INTEGER | NO | - | องค์กรเจ้าของหมวดหมู่ย่อย |
name | VARCHAR(255) | NO | - | ชื่อหมวดหมู่ย่อย |
slug | VARCHAR(255) | NO | - | slug ของหมวดหมู่ย่อยใน URL |
description | TEXT | YES | - | คำอธิบายหมวดหมู่ย่อย |
thumbnail | VARCHAR(500) | YES | - | URL รูปภาพประจำหมวดหมู่ย่อย |
sort_order | INTEGER | NO | 0 | ลำดับการแสดงผล |
status | ContentCategoryStatus (ENUM) | NO | active | สถานะ: active, inactive, delete |
parent_id | INTEGER | YES | - | หมวดหมู่ย่อยระดับบนกว่า (ใช้ทำโครงสร้างหลายชั้น) |
content_subcategory_id | INTEGER | YES | - | คอลัมน์อ้างอิงหมวดหมู่ย่อยที่เกี่ยวข้อง (self-reference) |
level | INTEGER | NO | 2 | ระดับชั้นของหมวดหมู่ย่อย (ระดับ 1 คือ category) |
created_date | TIMESTAMPTZ(3) | NO | now() | วันเวลาที่สร้าง |
created_by | INTEGER | NO | 0 | ผู้สร้าง (user id) |
updated_date | TIMESTAMPTZ(3) | NO | now() | วันเวลาที่แก้ไขล่าสุด |
updated_by | INTEGER | NO | 0 | ผู้แก้ไขล่าสุด (user id) |
deleted_date | TIMESTAMPTZ(3) | YES | - | วันเวลาที่ลบ (soft delete) |
ตาราง content_link
| Column | Type | Nullable | Default | คำอธิบาย |
|---|---|---|---|---|
id | SERIAL | NO | nextval(...) | Primary key |
uuid | UUID | NO | gen_random_uuid() | รหัสอ้างอิงภายนอกของลิงก์ (unique) |
token | VARCHAR(64) | NO | - | โทเคนที่ใช้ในลิงก์สาธารณะ (unique) |
line_oa_id | INTEGER | NO | - | LINE OA ที่ลิงก์นี้สังกัด (FK ไป line_oa.id) |
organization_id | INTEGER | NO | - | องค์กรเจ้าของลิงก์ |
name | VARCHAR(255) | NO | - | ชื่อลิงก์รวม |
description | TEXT | YES | - | คำอธิบายลิงก์รวม |
category_id | INTEGER | YES | - | กรองคอนเทนต์ตามหมวดหมู่ (FK ไป content_category.id) |
subcategory_id | INTEGER | YES | - | กรองคอนเทนต์ตามหมวดหมู่ย่อย (FK ไป content_subcategory.id) |
published_date_from | TIMESTAMPTZ(3) | YES | - | กรองคอนเทนต์ที่เผยแพร่ตั้งแต่วันเวลานี้ |
published_date_to | TIMESTAMPTZ(3) | YES | - | กรองคอนเทนต์ที่เผยแพร่จนถึงวันเวลานี้ |
audience_ids | JSONB | YES | '[]' | รายการ audience ที่กำหนดให้เข้าถึงลิงก์นี้ |
status | VARCHAR(20) | NO | 'active' | สถานะลิงก์ |
click_count | BIGINT | NO | 0 | จำนวนคลิกสะสมของลิงก์ |
created_date | TIMESTAMPTZ(3) | NO | now() | วันเวลาที่สร้าง |
created_by | INTEGER | NO | - | ผู้สร้าง (user id) |
updated_date | TIMESTAMPTZ(3) | NO | now() | วันเวลาที่แก้ไขล่าสุด |
updated_by | INTEGER | NO | - | ผู้แก้ไขล่าสุด (user id) |
deleted_date | TIMESTAMPTZ(3) | YES | - | วันเวลาที่ลบ (soft delete) |
deleted_by | INTEGER | YES | - | ผู้ลบ (user id) |
หมายเหตุ
content_categoryมี unique constraint บน (line_oa_id,slug) — slug ห้ามซ้ำภายใน OA เดียวกันcontent_subcategoryมี unique constraint บน (category_id,slug) — slug ของหมวดหมู่ย่อย ห้ามซ้ำภายในหมวดหมู่แม่เดียวกันcontent_subcategory.category_idเป็น FK ไปcontent_category.idแบบON DELETE CASCADE— ลบหมวดหมู่แม่แล้วหมวดหมู่ย่อยทั้งหมดจะถูกลบตามcontent_subcategoryรองรับโครงสร้างหลายชั้นผ่านparent_idและlevel(ค่า default2หมายถึงระดับที่สองถัดจาก category) โดยมี index บนทั้งสองคอลัมน์content_link.tokenมี unique constraint และมี index แยก เพราะใช้เป็น key ในการเปิดลิงก์ จากภายนอกcontent_linkเก็บเฉพาะ "เงื่อนไขการกรอง" ไม่ได้เก็บรายการคอนเทนต์ตรง ๆ — คอนเทนต์ที่แสดง ถูกคำนวณจากcategory_id,subcategory_idและช่วงpublished_date_from/published_date_to- ทั้งสามตารางใช้ soft delete ผ่าน
deleted_dateและมี index บนคอลัมน์นี้ content_categoryและcontent_subcategoryถูกอ้างอิงจากcontent_pageและcontent_link(ดู หน้าคอนเทนต์)