ภาพรวม
Domain นี้มี 2 ตาราง: customer_database เก็บ metadata ของชุดข้อมูลลูกค้าที่อัปโหลดขึ้นมา (CSV)
เช่น ชื่อชุดข้อมูล นิยามคอลัมน์ และจำนวนแถว ส่วน customer_database_row เก็บข้อมูลรายแถวในรูปแบบ
JSONB ใช้สำหรับ user profile mapping — จับคู่ข้อมูลที่ผู้ใช้กรอกในฟอร์มกับข้อมูลลูกค้าที่มีอยู่แล้ว
ตาราง customer_database
| Column | Type | Nullable | Default | คำอธิบาย |
|---|
id | INTEGER | NOT NULL | nextval (serial) | Primary key ของชุดข้อมูล |
line_oa_id | INTEGER | NOT NULL | – | LINE OA channel ที่เป็นเจ้าของชุดข้อมูลนี้ |
name | TEXT | NOT NULL | – | ชื่อชุดข้อมูลที่ผู้ใช้ตั้ง |
description | TEXT | NULL | – | คำอธิบายเพิ่มเติมของชุดข้อมูล |
columns | JSONB | NOT NULL | – | นิยามคอลัมน์ของชุดข้อมูล (ชื่อคอลัมน์ที่อ่านได้จากหัวตาราง CSV) |
row_count | INTEGER | NOT NULL | 0 | จำนวนแถวข้อมูลในชุดนี้ |
status | VARCHAR(20) | NOT NULL | 'active' | สถานะของชุดข้อมูล (ค่าเริ่มต้น active) |
created_by | INTEGER | NOT NULL | 0 | user id ของผู้อัปโหลด |
created_at | TIMESTAMPTZ | NOT NULL | now() | วันที่อัปโหลด |
updated_by | INTEGER | NULL | – | user id ของผู้แก้ไขล่าสุด |
updated_at | TIMESTAMPTZ | NULL | – | วันที่แก้ไขล่าสุด |
ตาราง customer_database_row
| Column | Type | Nullable | Default | คำอธิบาย |
|---|
id | INTEGER | NOT NULL | nextval (serial) | Primary key ของแถวข้อมูล |
database_id | INTEGER | NOT NULL | – | ชุดข้อมูลที่แถวนี้สังกัด (FK ไป customer_database.id, ON DELETE CASCADE) |
data | JSONB | NOT NULL | – | ข้อมูลของแถวนั้น เก็บเป็น key-value ตามคอลัมน์ที่นิยามไว้ใน customer_database.columns |
หมายเหตุ
- ทั้งสองตารางไม่มีอยู่ใน
schema.prisma — ถูกสร้างผ่าน manual SQL
(manual-sql/6.customer_database.sql) และนำขึ้น preprod เมื่อ 2 กรกฎาคม 2026 จึงใช้ชื่อคอลัมน์
แบบ created_at/updated_at (ไม่ใช่ created_date/updated_date เหมือนตารางที่มาจาก Prisma)
และ timestamp เป็น TIMESTAMPTZ โดยไม่ระบุ precision
- Foreign key:
customer_database_row.database_id -> customer_database.id แบบ
ON DELETE CASCADE — ลบชุดข้อมูลแล้วแถวทั้งหมดจะถูกลบตาม
- Index:
customer_database_row_db_idx (btree บน database_id) และ
customer_database_row_data_gin (GIN บน data ด้วย jsonb_path_ops) ตัวหลังใช้ค้นค่าภายใน
JSON ของแต่ละแถวได้เร็วเมื่อจับคู่กับข้อมูลที่ผู้ใช้กรอก
- ตารางเหล่านี้ทำงานร่วมกับคอลัมน์
profile_mapping (JSONB) ที่ถูกเพิ่มเข้าตาราง form_builder
ในสคริปต์เดียวกัน ซึ่งเก็บ config ว่าฟอร์มไหนจับคู่กับชุดข้อมูลไหนและด้วยคอลัมน์ใด
customer_database ผูกกับ channel ผ่าน line_oa_id โดยตรง ไม่มีคอลัมน์ organization_id
การกรองตามองค์กรจึงต้อง join ผ่าน line_oa