PlusMagi's Blog By Pitt Phunsanit Backend,Database Who You Are: ชื่อ บทบาท หน้าที่หลัก หรือตำแหน่งปัจจุบันที่กระชับและชัดเจน

Who You Are: ชื่อ บทบาท หน้าที่หลัก หรือตำแหน่งปัจจุบันที่กระชับและชัดเจน

SQL

-- 1. สร้างตารางตัวอย่าง (Setup)
CREATE TABLE user_profiles (
    user_id INT PRIMARY KEY,
    username VARCHAR(100),
    roles_string VARCHAR(255)
);

-- 2. ใส่ข้อมูลตัวอย่าง (Data Insertion)
INSERT INTO user_profiles (user_id, username, roles_string) VALUES
(1, 'Alice', 'admin,editor,viewer'),
(2, 'Bob', 'viewer,guest'),
(3, 'Charlie', 'admin');
“>

ในการดึงบทบาทแต่ละบทบาทออกมาเป็นแถวข้อมูล (Row) เราจะใช้คำสั่งดังนี้:

SQL

SELECT
    up.username,
    role_attribute
FROM
    user_profiles up
CROSS JOIN LATERAL unnest(string_to_array(up.roles_string, ',')) AS role_attribute
WHERE
    up.user_id = 1;
“>

คำอธิบายโค้ด:
string_to_array(up.roles_string, ','): แปลงสตริง ‘admin,editor,viewer’ ให้เป็น Array {‘admin’, ‘editor’, ‘viewer’}
unnest(...): ขยาย Array นั้นให้กลายเป็นชุดของแถวข้อมูล (Rows) ที่สามารถนำมา Query ได้อย่างเป็นระเบียบ
CROSS JOIN LATERAL: เป็นกลไกที่ใช้ในการเชื่อมตารางกับผลลัพธ์ที่ถูกแตกออกมาจากฟังก์ชัน

บทสรุปสำหรับสถาปนิกระบบ

“>

การเข้าใจการจัดการ Identity ในระดับ PostgreSQL ด้วยการใช้ฟังก์ชัน `string_to_array()` และ `unnest()` ไม่เพียงแต่ช่วยให้การ Query ข้อมูลบทบาททำได้ง่ายขึ้นเท่านั้น แต่ยังยกระดับความสามารถของระบบให้สามารถจัดการข้อมูลที่มีความซับซ้อนในรูปแบบที่ยืดหยุ่น (Flexible Schema) ได้อย่างมีประสิทธิภาพ ทำให้คุณสามารถออกแบบระบบสิทธิ์การเข้าถึง (Access Control) ที่แข็งแกร่งและรองรับการขยายตัวของบทบาทผู้ใช้ในอนาคตได้อย่างมั่นคง

“>

ในโลกของการออกแบบสถาปัตยกรรมข้อมูล (Data Architecture) และระบบซอฟต์แวร์ที่ซับซ้อน การนิยามตัวตน (Identity) ของผู้ใช้งานหรือเอนทิตี (Entity) อย่างชัดเจนและแม่นยำ คือรากฐานสำคัญที่สุดในการรักษาความปลอดภัยและความสมบูรณ์ของข้อมูล (Data Integrity) การกำหนดว่า ‘ใครคือใคร’ และ ‘มีสิทธิ์อะไรบ้าง’ ไม่ใช่แค่เรื่องของ User Interface แต่คือหัวใจหลักของการจัดการสิทธิ์ในระดับระบบฐานข้อมูล

“>

สำหรับนักพัฒนาและ System Architect การเข้าใจวิธีการจัดการบทบาท (Roles) และคุณสมบัติ (Attributes) ของผู้ใช้ใน PostgreSQL จึงเป็นทักษะที่ขาดไม่ได้ เนื่องจาก PostgreSQL มีเครื่องมือที่ทรงพลังในการแยก วิเคราะห์ และจัดการข้อมูลที่ถูกจัดเก็บในรูปแบบสตริง (String) ให้กลายเป็นโครงสร้างข้อมูลที่เป็นระเบียบและพร้อมใช้งานสำหรับการประมวลผลเชิงลึก

หลักการจัดการ Identity: จาก String สู่ Structured Data

“>

เมื่อเราพูดถึงการกำหนด ‘Who You Are’ ในบริบทของระบบฐานข้อมูล เรามักพบว่าข้อมูลบทบาทของผู้ใช้ (เช่น ‘admin’, ‘editor’, ‘viewer’) ถูกจัดเก็บในคอลัมน์เดียวในรูปแบบของข้อความที่คั่นด้วยเครื่องหมาย (Comma-Separated Values: CSV) การจัดการข้อมูลลักษณะนี้ด้วย SQL แบบพื้นฐานอาจทำให้เกิดความยุ่งยากในการเรียกใช้งาน เนื่องจากข้อมูลยังอยู่ในรูปแบบสตริงที่ไม่มีโครงสร้าง (Unstructured String)

“>

PostgreSQL ได้เตรียมฟังก์ชันเฉพาะทางเพื่อแก้ปัญหานี้ โดยเฉพาะฟังก์ชันที่เกี่ยวข้องกับการจัดการอาร์เรย์ (Arrays) และการแยกสตริง (String Parsing) ซึ่งช่วยให้เราสามารถเปลี่ยนสตริง CSV ให้กลายเป็นแถวข้อมูล (Rows) ที่สามารถนำไป Join, Filter, หรือประมวลผลต่อได้อย่างมีประสิทธิภาพในระดับสถาปัตยกรรม

การใช้ PostgreSQL Functions เพื่อแยกบทบาท (Parsing Roles)

“>

หัวใจสำคัญในการจัดการบทบาทจากสตริงคือการใช้ฟังก์ชัน `string_to_array()` ร่วมกับ `unnest()` ฟังก์ชันเหล่านี้ทำงานร่วมกันเพื่อรับสตริงที่ถูกคั่นด้วยเครื่องหมาย (Delimiter) และแตกออกเป็นชุดของค่า (Array) จากนั้น `unnest()` จะขยายชุดค่าเหล่านั้นให้กลายเป็นแถวข้อมูลที่สามารถ Query ได้ทันที

“>

สมมติว่าเรามีตาราง `user_profiles` ที่เก็บบทบาทของผู้ใช้ในคอลัมน์ `roles_string`:

SQL

-- 1. สร้างตารางตัวอย่าง (Setup)
CREATE TABLE user_profiles (
    user_id INT PRIMARY KEY,
    username VARCHAR(100),
    roles_string VARCHAR(255)
);

-- 2. ใส่ข้อมูลตัวอย่าง (Data Insertion)
INSERT INTO user_profiles (user_id, username, roles_string) VALUES
(1, 'Alice', 'admin,editor,viewer'),
(2, 'Bob', 'viewer,guest'),
(3, 'Charlie', 'admin');
“>

ในการดึงบทบาทแต่ละบทบาทออกมาเป็นแถวข้อมูล (Row) เราจะใช้คำสั่งดังนี้:

SQL

SELECT
    up.username,
    role_attribute
FROM
    user_profiles up
CROSS JOIN LATERAL unnest(string_to_array(up.roles_string, ',')) AS role_attribute
WHERE
    up.user_id = 1;
“>

คำอธิบายโค้ด:
string_to_array(up.roles_string, ','): แปลงสตริง ‘admin,editor,viewer’ ให้เป็น Array {‘admin’, ‘editor’, ‘viewer’}
unnest(...): ขยาย Array นั้นให้กลายเป็นชุดของแถวข้อมูล (Rows) ที่สามารถนำมา Query ได้อย่างเป็นระเบียบ
CROSS JOIN LATERAL: เป็นกลไกที่ใช้ในการเชื่อมตารางกับผลลัพธ์ที่ถูกแตกออกมาจากฟังก์ชัน

บทสรุปสำหรับสถาปนิกระบบ

“>

การเข้าใจการจัดการ Identity ในระดับ PostgreSQL ด้วยการใช้ฟังก์ชัน `string_to_array()` และ `unnest()` ไม่เพียงแต่ช่วยให้การ Query ข้อมูลบทบาททำได้ง่ายขึ้นเท่านั้น แต่ยังยกระดับความสามารถของระบบให้สามารถจัดการข้อมูลที่มีความซับซ้อนในรูปแบบที่ยืดหยุ่น (Flexible Schema) ได้อย่างมีประสิทธิภาพ ทำให้คุณสามารถออกแบบระบบสิทธิ์การเข้าถึง (Access Control) ที่แข็งแกร่งและรองรับการขยายตัวของบทบาทผู้ใช้ในอนาคตได้อย่างมั่นคง