คุณสามารถทำการ 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
-
ติดตั้ง Extension: ตรวจสอบให้แน่ใจว่า extension
postgres_fdw
ได้ถูกเปิดใช้งานในการติดตั้ง PostgreSQL ของคุณ คุณสามารถสร้าง extension ด้วยคำสั่งต่อไปนี้:CREATE EXTENSION postgres_fdw;
-
กำหนด Foreign Server: สร้างเซิร์ฟเวอร์ที่เชื่อมต่อกับฐานข้อมูลเป้าหมาย:
CREATE SERVER foreign_server_name FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'host_address', dbname 'databaseB', port '5432');
-
สร้าง User Mapping: คุณจะต้องสร้างการแมพปิ้งสำหรับผู้ใช้เพื่อติดต่อกับเซิร์ฟเวอร์ต่างประเทศ:
CREATE USER MAPPING FOR local_user SERVER foreign_server_name OPTIONS (user 'remote_user', password 'remote_password');
-
นำเข้าชื่อ Schema ต่างประเทศ: คุณสามารถนำเข้าชื่อ Schema ต่างประเทศที่มีตารางที่คุณต้องการเข้าถึง:
IMPORT FOREIGN SCHEMA public FROM SERVER foreign_server_name INTO local_schema;
-
ค้นหาข้อมูลในตารางระยะไกล: ตอนนี้คุณสามารถค้นหาตารางต่างประเทศได้เหมือนกับตารางในเครื่องปกติ:
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 สามารถให้ฟังก์ชันการทำงานและการสนับสนุนที่ดีขึ้น
ด้วยเครื่องมือและกลยุทธ์ที่เหมาะสม การเข้าถึงข้อมูลระหว่างฐานข้อมูลจึงง่ายกว่าที่เคย ขอให้สนุกกับการค้นหา!