เพื่อน LINE (LINE User)
ภาพรวม
Domain นี้มีตารางเดียวคือ line_user เก็บโปรไฟล์ของเพื่อน (ผู้ติดตาม) แต่ละคนใน LINE OA
หนึ่ง record คือหนึ่งคู่ของ LINE user กับ channel รวมข้อมูลจาก LINE profile, ข้อมูลที่ลูกค้ากรอกเอง,
สถานะ follow/unfollow, rich menu ที่ผูกอยู่, สมาชิกภาพใน audience และ attribute ที่กำหนดเอง
(custom_attribute)
ตาราง line_user
| Column | Type | Nullable | Default | คำอธิบาย |
|---|---|---|---|---|
id | UUID | NOT NULL | gen_random_uuid() | Primary key ภายในระบบ |
user_id | TEXT | NOT NULL | – | LINE user ID (Uxxxxxxxx...) จาก LINE Platform |
display_name | TEXT | NOT NULL | – | ชื่อที่แสดงบนโปรไฟล์ LINE |
picture_url | TEXT | NOT NULL | – | URL รูปโปรไฟล์จาก LINE |
user_info | JSONB | NULL | – | ข้อมูลโปรไฟล์ดิบที่ได้จาก LINE API |
language | TEXT | NOT NULL | 'th' | ภาษาที่ใช้สื่อสารกับเพื่อนคนนี้ |
firstname | TEXT | NULL | – | ชื่อจริง (ได้จากฟอร์มลงทะเบียนหรือการนำเข้าข้อมูล) |
lastname | TEXT | NULL | – | นามสกุล |
email | TEXT | NULL | – | อีเมล |
mobile_no | TEXT | NULL | – | เบอร์โทรศัพท์มือถือ |
follow | CommonConfirm (enum) | NOT NULL | – | สถานะการเป็นเพื่อนปัจจุบัน: yes = ยังติดตามอยู่, no = บล็อก/เลิกติดตาม |
rich_menu_id | INTEGER | NULL | – | Rich menu ที่ผูกกับผู้ใช้คนนี้ (FK ไป rich_menu.id) |
registered_date | TIMESTAMPTZ(3) | NULL | – | วันที่ลงทะเบียน (กรอกฟอร์ม/ยืนยันตัวตน) |
unfollow_date | TIMESTAMPTZ(3) | NULL | – | วันที่เลิกติดตาม/บล็อก OA |
status | CommonStatus (enum) | NOT NULL | active | สถานะของ record |
deleted_date | TIMESTAMPTZ(3) | NULL | – | วันที่ลบแบบ soft delete |
created_by | INTEGER | NULL | – | user id ของผู้สร้าง (กรณีสร้างจาก CMS/import) |
updated_by | INTEGER | NULL | – | user id ของผู้แก้ไขล่าสุด |
created_date | TIMESTAMPTZ(3) | NOT NULL | CURRENT_TIMESTAMP | วันที่สร้าง record |
updated_date | TIMESTAMPTZ(3) | NULL | – | วันที่แก้ไขล่าสุด |
organization_id | INTEGER | NOT NULL | – | องค์กรเจ้าของข้อมูล |
line_oa_id | INTEGER | NOT NULL | – | LINE OA channel ที่ผู้ใช้คนนี้เป็นเพื่อนอยู่ |
user_type | LineUserType (enum) | NULL | guest | ประเภทเพื่อน: guest (ยังไม่ลงทะเบียน) หรือ member (ลงทะเบียนแล้ว) |
last_activity_type | ActivityType (enum) | NULL | follow | ประเภทกิจกรรมล่าสุด: follow, unfollow, message, tracking |
last_activity_period | ActivityPeriod (enum) | NULL | – | ช่วงเวลาของกิจกรรมล่าสุด: morning, afternoon, evening, night |
last_activity_date | TIMESTAMPTZ(3) | NULL | CURRENT_TIMESTAMP | วันเวลาของกิจกรรมล่าสุด |
last_activity_status | ActivityStatus (enum) | NULL | active | สถานะความเคลื่อนไหว: active หรือ inactive |
audience_ids | JSONB | NULL | – | รายการ id ของ audience/segment ที่ผู้ใช้คนนี้เป็นสมาชิก (JSON array) |
rich_menu_archive_id | INTEGER | NULL | – | Rich menu ที่ถูก archive แล้วซึ่งเคยผูกกับผู้ใช้ (FK ไป rich_menu_archive.id) |
custom_attribute | JSONB | NULL | {} | Attribute ที่องค์กรกำหนดเอง เก็บเป็น key-value ตามที่ประกาศไว้ใน attribute_master |
หมายเหตุ
- Unique constraint:
(user_id, line_oa_id, organization_id)— LINE user คนเดียวกันเป็นเพื่อนของ หลาย channel ได้ แต่จะมีได้ record เดียวต่อ channel - Index:
line_user_line_oa_id_idx(btree บนline_oa_id) และline_user_audience_ids_idx(GIN บนaudience_idsสำหรับ query สมาชิก audience ให้เร็ว) - Foreign key:
rich_menu_id->rich_menu.id,rich_menu_archive_id->rich_menu_archive.idส่วนorganization_idและline_oa_idไม่ได้ประกาศเป็น FK constraint ใน Prisma แต่ใช้อ้างอิง เชิงตรรกะ custom_attributeเป็น JSON object แบบ key-value เช่น{"member_tier":"gold","birth_month":"05"}โดยรายการ key ที่อนุญาตและชนิดข้อมูลถูกกำหนดไว้ใน ตารางattribute_masterของแต่ละ channel ค่า default คือ object ว่างaudience_idsเป็น JSON array ของ audience id ที่ถูกอัปเดตเมื่อมีการรีเฟรช audience — ใช้ GIN index ทำให้ค้นหาสมาชิกของ audience หนึ่งๆ ได้โดยไม่ต้อง join ตารางกลาง- คู่
last_activity_*ใช้สร้าง segment เชิงพฤติกรรม (เช่น เพื่อนที่ไม่มีความเคลื่อนไหวเกิน N วัน)