{"id":1893,"date":"2017-09-30T16:43:41","date_gmt":"2017-09-30T13:43:41","guid":{"rendered":"http:\/\/blog.profelis.com.tr\/?p=1893"},"modified":"2023-02-01T10:58:00","modified_gmt":"2023-02-01T07:58:00","slug":"postgresqlin-yabanci-veri-paketleyicileri-foreign-data-wrappers","status":"publish","type":"post","link":"https:\/\/profelis.com.tr\/en\/2017\/09\/30\/postgresqlin-yabanci-veri-paketleyicileri-foreign-data-wrappers\/","title":{"rendered":"PostgreSQL&#8217;in Yabanc\u0131 Veri Paketleyicileri &#8211; Foreign Data Wrappers"},"content":{"rendered":"<h2>PostgreSQL&#8217;in Yabanc\u0131 Veri Paketleyicileri &#8211; Foreign Data Wrappers<\/h2>\n<p>PostgreSQL i\u00e7erisinde yer alan yabanc\u0131 sistemlere ba\u011flanarak veri almay\u0131, sorgulamay\u0131 m\u00fcmk\u00fcn hale getiren Foreign data wrappers (Yabanc\u0131 Veri Paketleyicileri) eklentileri \u00e7ok uzun bir zamandan beri mevcut olmakla birlikte, son d\u00f6nemde hem iyice olgunla\u015ft\u0131lar hem de daha \u00e7ok kullan\u0131m alan\u0131 buldular. Hele ki g\u00fcn\u00fcm\u00fcz\u00fcn birden fazla veritaban\u0131 markas\u0131n\u0131 i\u00e7eren kurumsal yap\u0131lar\u0131nda, RDBMS, nosql ve hadoop benzeri da\u011f\u0131t\u0131k mimarilerin yayg\u0131nla\u015fmas\u0131 ile birden fazla veri kayna\u011f\u0131n\u0131 ayn\u0131 anda sorgulamak, ortak cevap getirmek veya konu\u015fturmak i\u00e7in terc\u00fcman g\u00f6revi g\u00f6rmek s\u00f6z konusu oldu\u011funda \u00e7ok daha \u00f6nemli hale geldiler.<\/p>\n<h2>Foreign Data Wrappers Nedir?<\/h2>\n<p>FDW, Postgres i\u00e7erisinden harici\/uzak\/farkl\u0131 veri sistemlerine do\u011frudan ba\u011flanman\u0131z\u0131, sorgulaman\u0131z\u0131 sa\u011flayan terc\u00fcmanlard\u0131r diyebiliriz. Bir eklenti olarak kurulan FDW ile sadece uzak farkl\u0131 veritaban\u0131 sistemlerine ba\u011flanmak ve veri alabilmenin, sorgu g\u00f6nderebilmenin yan\u0131 s\u0131ra ayn\u0131 zamanda yazma i\u015flemi de yapabilmekteyiz. FWD&#8217;yi, farkl\u0131 veri kaynaklar\u0131ndan verileri normalize ederek merkezi bir veritaban\u0131na join sorgular olu\u015fturarak \u00e7ekmek i\u00e7in ETL arac\u0131 olarak da kullanmak da m\u00fcmk\u00fcn olmakla birlikte, belki en performansl\u0131 ara\u00e7 olmayabilir ama \u015furas\u0131 kesin ki en h\u0131zl\u0131 y\u00f6ntemdir.<\/p>\n<p>Uygulaman\u0131z ayn\u0131 anda iki farkl\u0131 veritaban\u0131 kullanm\u0131yor olabilir, ama sizin iki uygulama aras\u0131nda entegrasyonu, raporlamay\u0131 sa\u011flamak i\u00e7in ayn\u0131 anda iki veritaban\u0131ndan birlikte veri \u00e7ekmeye veya bir veritaban\u0131ndaki bir tabloyu referans olarak kullan\u0131p, di\u011fer veritaban\u0131ndaki tablodan belirli bir sonu\u00e7 k\u00fcmesini getirmeye ihtiyac\u0131n\u0131z olabilir. \u00d6rnekler \u00e7o\u011falt\u0131labilir.<\/p>\n<p>FWD eklentilerinin bir k\u0131sm\u0131 Postgres \u00fczerinde haz\u0131r olarak gelirken, baz\u0131lar\u0131 copyright vs sebeplerden dolay\u0131 a\u00e7\u0131k kaynakl\u0131 paketin i\u00e7ine dahil edilemezler ve ayr\u0131ca indirilmelidirler. Buna \u00f6rnek MySQL FWD&#8217;yi aktif hale getirmeden \u00f6nce <a href=\"https:\/\/github.com\/EnterpriseDB\" target=\"_blank\" rel=\"noopener\">indirip<\/a> kurman\u0131z gerekir ki bu \u00e7ok basit bir i\u015flemdir.<\/p>\n<p>Baz\u0131 FWD Eklentilerine k\u0131saca g\u00f6z atal\u0131m:<\/p>\n<h3>Postgres FDW<\/h3>\n<p>\u015e\u00fcphesiz en kolay ve h\u0131zl\u0131 giri\u015f yapabilece\u011fimiz FWD, Postgres&#8217;in kaynak olarak farkl\u0131 bir host \u00fczerinde olan yine PostgreSQL veritaban\u0131na ba\u011flanmak i\u00e7in kulland\u0131\u011f\u0131m\u0131z Potgres FWD olacak. Bir FWD&#8217;yi en temel \u015fartlar\u0131 ile kullan\u0131ma alman\u0131n yolu<\/p>\n<ol>\n<li>CREATE EXTENSION postgres_fdw; ile aktif hale getirmek,<\/li>\n<li>CREATE SERVER ile u\u00e7 nokta tan\u0131m\u0131n\u0131 yap\u0131p ba\u011flant\u0131y\u0131 tan\u0131mlamak (host\/port vs),<\/li>\n<li>CREATE USER MAPPING ile uzak veritaban\u0131na ba\u011flanacak olan kullan\u0131c\u0131y\u0131 olu\u015fturmak,<\/li>\n<li>CREATE FOREIGN TABLE ile uzak yabanc\u0131 tabloyu olu\u015fturmak<\/li>\n<\/ol>\n<p>Bu i\u015flemleri yapt\u0131ktan sonra kendi sisteminizdeki veritaban\u0131n\u0131z \u00fczerinde bir tablo olu\u015ftu\u011funu ve bunun asl\u0131nda sorgulama esnas\u0131nda uzak hosttaki tablo \u00fczerinden sorgulama yapt\u0131\u011f\u0131n\u0131 g\u00f6receksiniz.<\/p>\n<p><strong>MySQL FWD<\/strong><\/p>\n<p>MySQL FWD&#8217;yi <a href=\"https:\/\/github.com\/EnterpriseDB\/mysql_fdw\" target=\"_blank\" rel=\"noopener\">indirip<\/a> kurduktan sonra, s\u0131ras\u0131yla uygulad\u0131\u011f\u0131m\u0131z sorgular:<\/p>\n<pre>CREATE EXTENSION mysql_fdw;\n\nCREATE SERVER mysql_server\n FOREIGN DATA WRAPPER mysql_fdw\n OPTIONS (host '127.0.0.1', port '3306');\n\nCREATE USER MAPPING FOR postgres\n SERVER mysql_server\n OPTIONS (username \u2018tolga\u2019, password \u2018gizliparola\u2019);\n\nCREATE FOREIGN TABLE helpdesk_users (\n id integer NOT NULL,\n username varchar(255),\n password varchar(255),\n last_login timestamptz\n )\n SERVER mysql_server;<\/pre>\n<h3>MongoDB FWD<\/h3>\n<p>SQL veritaban\u0131ndan SQL veritaban\u0131na ba\u011flanmak tamam, peki ya SQL&#8217;den NOSQL&#8217;e ba\u011flan\u0131rken? Asl\u0131nda s\u00fcre\u00e7 temel olarak MySQL ba\u011flant\u0131s\u0131n\u0131 kurarken yapt\u0131klar\u0131m\u0131z ile ayn\u0131d\u0131r. Tek de\u011fi\u015fiklik, son ad\u0131mda yabanc\u0131 tabloyu olu\u015ftururken, nosql taraf\u0131nda veri \u015fekilsel olmad\u0131\u011f\u0131 i\u00e7in, farkl\u0131 bir yakla\u015f\u0131m izleriz: bir veritaban\u0131 ve i\u00e7erisinde bir kolleksiyon olu\u015fturmal\u0131y\u0131z.<\/p>\n<pre>CREATE FOREIGN TABLE helpdesk_users(\n     _id NAME,\n     user_id int,\n     user_username text,\n     user_last_login timestamptz)\nSERVER mongo_server\n     OPTIONS (database 'db', collection 'users');<\/pre>\n<p>\u015eimdi art\u0131k DML tarz\u0131 sorgular\u0131m\u0131z\u0131 Postgres i\u00e7erisinden SQL kullanarak MongoDB&#8217;ye g\u00f6nderebiliriz veya sonu\u00e7 getirebiliriz.<\/p>\n<pre>SELECT * \nFROM helpdesk_users\nWHERE user_last_login &gt;= now() - '1 day'::interval;<\/pre>\n<p>veya<\/p>\n<pre>DELETE FROM helpdesk_users WHERE user_id = 100;<\/pre>\n<p>Bu \u00f6zelliklerin kullan\u0131m\u0131 yan\u0131nda performans penalt\u0131s\u0131na sebep olabilir, kullan\u0131m\u0131n\u0131za g\u00f6re bu de\u011fi\u015fir. Veri g\u00f6\u00e7\u00fc, raporlama, yo\u011fun olmayan kullan\u0131mlarda FWD \u00e7ok i\u015fe yarar bir ara\u00e7t\u0131r, ama her zaman, her durumda tavsiye edemeyiz.<\/p>\n<p>T\u00fcm bu yaz\u0131da anlatt\u0131klar\u0131m\u0131z\u0131n bir k\u0131sm\u0131, \u00f6rne\u011fin yabanc\u0131 tablolar ile yerel tablolar aras\u0131nda JOIN kurmak, DML sorgular\u0131 (DELETE, UPDATE, INSERT vb) PostgreSQL 9.6 s\u00fcr\u00fcm\u00fc ile duyurulan yeni \u00f6zelliklerdir. L\u00fctfen g\u00fcncel s\u00fcr\u00fcm notlar\u0131n\u0131 takip ediniz ve elinizdeki s\u00fcr\u00fcm\u00fcn en az 9.6 oldu\u011fundan emin olunuz.<\/p>\n<p>Di\u011fer baz\u0131 FWD&#8217;ler i\u00e7in:\u00a0<a href=\"https:\/\/wiki.postgresql.org\/wiki\/Foreign_data_wrappers\" target=\"_blank\" rel=\"noopener\">https:\/\/wiki.postgresql.org\/wiki\/Foreign_data_wrappers<\/a>\u00a0adresine g\u00f6z atabilirsiniz. Burada yay\u0131nlanmayan baz\u0131 FWD&#8217;lerin Github \u00fczerinde oldu\u011funu da s\u00f6yleyelim.<\/p>","protected":false},"excerpt":{"rendered":"<p>PostgreSQL i\u00e7erisinde yer alan yabanc\u0131 sistemlere ba\u011flanarak veri almay\u0131, sorgulamay\u0131 m\u00fcmk\u00fcn hale getiren Foreign data wrappers (Yabanc\u0131 Veri Paketleyicileri) eklentileri \u00e7ok uzun bir zamandan beri mevcut olmakla birlikte, son d\u00f6nemde hem iyice olgunla\u015ft\u0131lar hem de daha \u00e7ok kullan\u0131m alan\u0131 buldular.<\/p>","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[75,45],"tags":[48,60],"class_list":["post-1893","post","type-post","status-publish","format-standard","hentry","category-postgresql","category-yazi","tag-enterprisedb","tag-postgresql"],"_links":{"self":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/posts\/1893","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/comments?post=1893"}],"version-history":[{"count":0,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/posts\/1893\/revisions"}],"wp:attachment":[{"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/media?parent=1893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/categories?post=1893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/profelis.com.tr\/en\/wp-json\/wp\/v2\/tags?post=1893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}