Skip to main content

หน้าคอนเทนต์

ภาพรวม

Domain นี้มี 5 ตาราง: content_page เป็นตารางหลักเก็บข้อมูลหน้าคอนเทนต์ (slug, สถานะ, การควบคุมการเข้าถึง, สถิติ) ส่วนอีก 4 ตารางเป็นส่วนขยายที่อ้างอิงกลับมาที่ content_page_id ได้แก่ content_page_translation (เนื้อหาและ SEO แยกตามภาษา), content_page_utm (พารามิเตอร์ UTM แบบ 1:1), content_page_analytics (สคริปต์ tracking แบบ 1:1) และ content_page_view (log การเข้าชมรายครั้ง)

ตาราง content_page

ColumnTypeNullableDefaultคำอธิบาย
idSERIALNOnextval(...)Primary key
uuidUUIDNOgen_random_uuid()รหัสอ้างอิงภายนอกของหน้า (unique)
line_oa_idINTEGERNO-LINE OA ที่หน้านี้สังกัด (FK ไป line_oa.id)
user_idINTEGERNO-ผู้ใช้เจ้าของหน้า
organization_idINTEGERNO-องค์กรเจ้าของหน้า
slugVARCHAR(255)NO-slug ของหน้าใน URL
statusContentPageStatus (ENUM)NOdraftสถานะหน้า: draft, published, archived
versionINTEGERNO1เลขเวอร์ชันของหน้า
public_tokenVARCHAR(255)YES-โทเคนสำหรับเปิดหน้าแบบสาธารณะ (unique)
require_authBOOLEANNOfalseต้องล็อกอินก่อนเข้าดูหน้านี้หรือไม่
password_protectedBOOLEANNOfalseป้องกันด้วยรหัสผ่านหรือไม่
password_hashVARCHAR(255)YES-ค่า hash ของรหัสผ่านที่ใช้ป้องกันหน้า
published_atTIMESTAMPTZ(3)YES-วันเวลาที่เผยแพร่
published_byINTEGERYES-ผู้เผยแพร่ (user id)
archived_atTIMESTAMPTZ(3)YES-วันเวลาที่เก็บเข้าคลัง (archive)
archived_byINTEGERYES-ผู้เก็บเข้าคลัง (user id)
view_countBIGINTNO0จำนวนการเข้าชมทั้งหมด
unique_view_countBIGINTNO0จำนวนผู้เข้าชมที่ไม่ซ้ำ
category_idINTEGERYES-หมวดหมู่ของหน้า (FK ไป content_category.id)
subcategory_idINTEGERYES-หมวดหมู่ย่อยของหน้า (FK ไป content_subcategory.id)
audience_idsJSONBYES'[]'รายการ audience ที่กำหนดให้เห็นหน้านี้
friend_track_campaign_idINTEGERYES-แคมเปญ Friend Track ที่ผูกกับหน้านี้ (FK ไป friend_track_campaign.id)
friend_track_button_textVARCHAR(255)YES-ข้อความบนปุ่ม Friend Track ที่แสดงในหน้า
created_dateTIMESTAMPTZ(3)NOnow()วันเวลาที่สร้าง
created_byINTEGERNO-ผู้สร้าง (user id)
updated_dateTIMESTAMPTZ(3)NOnow()วันเวลาที่แก้ไขล่าสุด
updated_byINTEGERNO-ผู้แก้ไขล่าสุด (user id)
deleted_dateTIMESTAMPTZ(3)YES-วันเวลาที่ลบ (soft delete)
deleted_byINTEGERYES-ผู้ลบ (user id)

ตาราง content_page_translation

ColumnTypeNullableDefaultคำอธิบาย
idSERIALNOnextval(...)Primary key
content_page_idINTEGERNO-หน้าคอนเทนต์ที่คำแปลนี้สังกัด (FK ไป content_page.id)
languageVARCHAR(10)NO-รหัสภาษาของคำแปล เช่น th, en
titleVARCHAR(500)NO-หัวเรื่องของหน้าในภาษานี้
contentTEXTYES-เนื้อหาของหน้าในภาษานี้
excerptTEXTYES-เนื้อหาย่อ/คำโปรยของหน้า
meta_titleVARCHAR(160)YES-SEO meta title
meta_descriptionVARCHAR(320)YES-SEO meta description
meta_keywordsTEXTYES-SEO meta keywords
og_titleVARCHAR(160)YES-Open Graph title สำหรับการแชร์
og_descriptionVARCHAR(320)YES-Open Graph description สำหรับการแชร์
og_image_urlTEXTYES-URL รูปภาพ Open Graph
twitter_cardVARCHAR(50)YES-ประเภท Twitter card
created_dateTIMESTAMPTZ(3)NOnow()วันเวลาที่สร้าง
created_byINTEGERNO-ผู้สร้าง (user id)
updated_dateTIMESTAMPTZ(3)NOnow()วันเวลาที่แก้ไขล่าสุด
updated_byINTEGERNO-ผู้แก้ไขล่าสุด (user id)

ตาราง content_page_utm

ColumnTypeNullableDefaultคำอธิบาย
idSERIALNOnextval(...)Primary key
content_page_idINTEGERNO-หน้าคอนเทนต์ที่ผูกอยู่ (unique — ความสัมพันธ์แบบ 1:1)
utm_sourceVARCHAR(255)YES-ค่า UTM source เริ่มต้นของหน้า
utm_mediumVARCHAR(255)YES-ค่า UTM medium เริ่มต้นของหน้า
utm_campaignVARCHAR(255)YES-ค่า UTM campaign เริ่มต้นของหน้า
utm_termVARCHAR(255)YES-ค่า UTM term เริ่มต้นของหน้า
utm_contentVARCHAR(255)YES-ค่า UTM content เริ่มต้นของหน้า
created_dateTIMESTAMPTZ(3)NOnow()วันเวลาที่สร้าง
created_byINTEGERNO-ผู้สร้าง (user id)
updated_dateTIMESTAMPTZ(3)NOnow()วันเวลาที่แก้ไขล่าสุด
updated_byINTEGERNO-ผู้แก้ไขล่าสุด (user id)

ตาราง content_page_analytics

ColumnTypeNullableDefaultคำอธิบาย
idSERIALNOnextval(...)Primary key
content_page_idINTEGERNO-หน้าคอนเทนต์ที่ผูกอยู่ (unique — ความสัมพันธ์แบบ 1:1)
ga_eventsJSONBYES-การตั้งค่า event ของ Google Analytics
fb_pixel_eventsTEXTYES-การตั้งค่า event ของ Facebook Pixel
line_tag_eventsTEXTYES-การตั้งค่า event ของ LINE Tag
custom_head_scriptsTEXTYES-สคริปต์เพิ่มเติมที่แทรกในส่วน head ของหน้า
custom_body_scriptsTEXTYES-สคริปต์เพิ่มเติมที่แทรกในส่วน body ของหน้า
enable_gaBOOLEANNOtrueเปิดใช้งาน Google Analytics หรือไม่
enable_fb_pixelBOOLEANNOfalseเปิดใช้งาน Facebook Pixel หรือไม่
enable_line_tagBOOLEANNOfalseเปิดใช้งาน LINE Tag หรือไม่
created_dateTIMESTAMPTZ(3)NOnow()วันเวลาที่สร้าง
created_byINTEGERNO-ผู้สร้าง (user id)
updated_dateTIMESTAMPTZ(3)NOnow()วันเวลาที่แก้ไขล่าสุด
updated_byINTEGERNO-ผู้แก้ไขล่าสุด (user id)

ตาราง content_page_view

ColumnTypeNullableDefaultคำอธิบาย
idSERIALNOnextval(...)Primary key
content_page_idINTEGERNO-หน้าคอนเทนต์ที่ถูกเข้าชม (FK ไป content_page.id)
viewer_ipVARCHAR(45)YES-IP address ของผู้เข้าชม (รองรับ IPv6)
viewer_user_agentTEXTYES-User agent ของผู้เข้าชม
viewer_referrerTEXTYES-URL ต้นทางที่ผู้เข้าชมมา (referrer)
viewer_line_uidVARCHAR(255)YES-LINE user id ของผู้เข้าชม (ถ้าระบุตัวตนได้)
utm_sourceVARCHAR(255)YES-ค่า UTM source ที่ติดมากับการเข้าชม
utm_mediumVARCHAR(255)YES-ค่า UTM medium ที่ติดมากับการเข้าชม
utm_campaignVARCHAR(255)YES-ค่า UTM campaign ที่ติดมากับการเข้าชม
utm_termVARCHAR(255)YES-ค่า UTM term ที่ติดมากับการเข้าชม
utm_contentVARCHAR(255)YES-ค่า UTM content ที่ติดมากับการเข้าชม
session_idVARCHAR(255)YES-รหัส session ของผู้เข้าชม (ใช้นับ unique view)
languageVARCHAR(10)YES-ภาษาที่ผู้เข้าชมใช้เปิดหน้า
device_typeVARCHAR(50)YES-ประเภทอุปกรณ์ของผู้เข้าชม
viewed_atTIMESTAMPTZ(3)NOnow()วันเวลาที่เข้าชม

หมายเหตุ

  • content_page มี unique constraint บน (line_oa_id, slug) — slug ห้ามซ้ำภายใน OA เดียวกัน แต่ต่าง OA ใช้ slug เดียวกันได้
  • content_page.public_token และ content_page.uuid ต่างก็มี unique constraint
  • ตารางลูกทั้ง 4 ตารางมี FK ไปยัง content_page.id พร้อม ON DELETE CASCADE — ลบหน้าแล้ว คำแปล/UTM/analytics/log การเข้าชมจะถูกลบตามทั้งหมด
  • content_page_utm.content_page_id และ content_page_analytics.content_page_id มี unique constraint จึงเป็นความสัมพันธ์แบบ 1:1 กับ content_page
  • content_page_translation มี unique constraint บน (content_page_id, language) — หนึ่งหน้ามีคำแปลได้ภาษาละหนึ่งชุด
  • content_page.friend_track_campaign_id เป็น FK ไป friend_track_campaign.id แบบ ON DELETE SET NULL — ลบแคมเปญแล้วหน้ายังอยู่แต่ค่าจะกลายเป็น NULL
  • content_page.category_id / subcategory_id เป็น FK ไป content_category.id และ content_subcategory.id (ดู หมวดหมู่คอนเทนต์และลิงก์รวม)
  • content_page.view_count และ unique_view_count เป็น counter ที่สรุปจาก content_page_view ซึ่งเก็บ log รายครั้ง โดยมี index บน content_page_id, session_id และ viewed_at