คุณสามารถทำการ Cross-Database Queries กับ PostgreSQL ได้หรือไม่? นี่คือวิธีการ!

หากคุณกำลังทำงานกับ PostgreSQL คุณอาจสงสัยว่ามันสามารถทำการ cross-database queries ได้หรือไม่ ซึ่งมักจะเกิดขึ้นเมื่อคุณต้องการเข้าถึงหรือจัดการข้อมูลที่ถูกแบ่งออกไปในหลายฐานข้อมูล สถานการณ์ที่พบบ่อยคือเมื่อสองฐานข้อมูลมีข้อมูลร่วมกันแต่ตั้งค่าแยกกัน — นำไปสู่คำถามว่า: คุณสามารถค้นหาข้อมูลจากฐานข้อมูลหนึ่งไปยังอีกฐานข้อมูลหนึ่งใน PostgreSQL ได้หรือไม่?

ความท้าทายของการ Cross-Database Queries

คุณอาจพบข้อความแสดงข้อผิดพลาดที่คล้ายกับนี้เมื่อพยายามดำเนินการค้นหาข้อมูลข้ามฐานข้อมูล:

databaseA=# select * from databaseB.public.someTableName;
ERROR:  cross-database references are not implemented: "databaseB.public.someTableName"

ข้อผิดพลาดนี้บ่งชี้ว่า PostgreSQL ไม่สนับสนุนการอ้างอิงโดยตรงระหว่างฐานข้อมูลโดยตรง ดังนั้นหากข้อมูลของคุณถูกจัดเก็บในฐานข้อมูลแยกกันและคุณต้องการดำเนินการค้นหาข้อมูลข้ามฐานข้อมูล คุณจะต้องมีทางออกทางเลือก

ทางออก: การใช้ Foreign Data Wrappers

เพื่อตอบสนองความต้องการในการค้นหาข้อมูลข้ามฐานข้อมูลใน PostgreSQL คุณสามารถใช้ฟีเจอร์ foreign data wrapper โดยเฉพาะ postgres_fdw ซึ่งจะช่วยให้คุณเชื่อมต่อกับตารางในฐานข้อมูล PostgreSQL ใด ๆ ได้ง่าย ไม่ว่าจะเป็นฐานข้อมูลที่อยู่ในเครื่องหรือฐานข้อมูลระยะไกล

การตั้งค่า postgres_fdw

  1. ติดตั้ง Extension: ตรวจสอบให้แน่ใจว่า extension postgres_fdw ได้ถูกเปิดใช้งานในการติดตั้ง PostgreSQL ของคุณ คุณสามารถสร้าง extension ด้วยคำสั่งต่อไปนี้:

    CREATE EXTENSION postgres_fdw;
    
  2. กำหนด Foreign Server: สร้างเซิร์ฟเวอร์ที่เชื่อมต่อกับฐานข้อมูลเป้าหมาย:

    CREATE SERVER foreign_server_name
    FOREIGN DATA WRAPPER postgres_fdw
    OPTIONS (host 'host_address', dbname 'databaseB', port '5432');
    
  3. สร้าง User Mapping: คุณจะต้องสร้างการแมพปิ้งสำหรับผู้ใช้เพื่อติดต่อกับเซิร์ฟเวอร์ต่างประเทศ:

    CREATE USER MAPPING FOR local_user
    SERVER foreign_server_name
    OPTIONS (user 'remote_user', password 'remote_password');
    
  4. นำเข้าชื่อ Schema ต่างประเทศ: คุณสามารถนำเข้าชื่อ Schema ต่างประเทศที่มีตารางที่คุณต้องการเข้าถึง:

    IMPORT FOREIGN SCHEMA public
    FROM SERVER foreign_server_name
    INTO local_schema;
    
  5. ค้นหาข้อมูลในตารางระยะไกล: ตอนนี้คุณสามารถค้นหาตารางต่างประเทศได้เหมือนกับตารางในเครื่องปกติ:

    SELECT * FROM local_schema.some_table_name;
    

สำหรับเวอร์ชันเก่าของ PostgreSQL

หากคุณกำลังใช้ PostgreSQL เวอร์ชัน ก่อน 9.3 ฟีเจอร์ foreign data wrapper จะไม่สามารถใช้งานได้ อย่างไรก็ตาม คุณสามารถใช้ฟังก์ชัน dblink ซึ่งช่วยให้คุณสามารถเชื่อมต่อกับฐานข้อมูล PostgreSQL อื่น ๆ ได้

  • การใช้ dblink: คุณจะต้องติดตั้งแพ็กเกจ postgresql-contrib หากมันยังไม่เป็นส่วนหนึ่งของการจัดจำหน่ายของคุณ จากนั้นคุณสามารถดำเนินการค้นหาได้ดังนี้:
    SELECT * FROM dblink('dbname=databaseB user=remote_user password=remote_password',
                        'SELECT * FROM public.some_table_name') AS t(column1 type1, column2 type2, ...);
    

หมายเหตุ: ควรพิจารณาการจัดโครงสร้างฐานข้อมูลของคุณใหม่หากเป็นไปได้ การใช้ schemas ภายในฐานข้อมูลเดียวแทนที่จะเป็นฐานข้อมูลแยกกันสามารถปรับปรุงการจัดการข้อมูลและการเข้าถึงได้มาก

สรุป

ในขณะที่ PostgreSQL ไม่สนับสนุนการค้นหาข้อมูลข้ามฐานข้อมูลโดยตรง การใช้ foreign data wrappers อย่างเช่น postgres_fdw ช่วยให้คุณมีทางออกที่มีประสิทธิภาพ โดยการตั้งค่าคอนฟิกที่จำเป็น สร้างความสะดวกในการเข้าถึงและจัดการข้อมูลระหว่างฐานข้อมูลต่าง ๆ

หากคุณใช้เวอร์ชันเก่า โปรดจำไว้ว่าในขณะที่ dblink เป็นตัวเลือกที่สามารถใช้งานได้ การอัปเกรดไปยังเวอร์ชันล่าสุดของ PostgreSQL สามารถให้ฟังก์ชันการทำงานและการสนับสนุนที่ดีขึ้น

ด้วยเครื่องมือและกลยุทธ์ที่เหมาะสม การเข้าถึงข้อมูลระหว่างฐานข้อมูลจึงง่ายกว่าที่เคย ขอให้สนุกกับการค้นหา!