Postgresql Nested Row ve JOIN

From: Kingem Kurdam <kingemkurdam(at)gmail(dot)com>
To: pgsql-tr-genel(at)postgresql(dot)org
Subject: Postgresql Nested Row ve JOIN
Date: 2018-01-01 23:09:33
Message-ID: CAAz63+Wy4U00gZ-=soUcDNeVUsL3ooquKswxuL4sAyUGznvsWQ@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-tr-genel

Merhabalar,
Mysql + mongodb üzerinde çalışan bir sistemi postgresql geçirmeyi
düşünüyorum.
Database'i dizayn ederken takıldım, yardımcı olursanız sevinirim.
Postgresql'un json ve transaction desteği inanılmaz güzel.

Şu şekilde bir kullanıcılar tablom var yaklaşık *30 bin* kayıt oluyor.

CREATE TABLE members
(
id SERIAL PRIMARY KEY NOT NULL,
username CHAR(50) NOT NULL,
password CHAR(50) NOT NULL,
manager_id INT NOT NULL,
super_manager_id INT NOT NULL,
joker_manager_id INT NOT NULL
);

Birde döküman tablom var yaklaşık *5 milyon* kayıt oluyor.

CREATE TABLE documents
(
id SERIAL PRIMARY KEY NOT NULL,
members_id INT NOT NULL,
document_name CHAR(50) NOT NULL,
);

Şuan aktif sistemde *members *kısmı *mysql*'de *documents* kısmı da*
mongodb*'de bulunuyor ve döküman eklendiğinde
manager_username,joker_manager_username, super_manager_username
manager_id,joker_manager_id ve super_manager_id
kayıtla birlikte ekleniyor.
Fakat sistemde kullanıcının manageri değiştiğinde dökümanlarda kullanıcının
bu *6 kolonunun* değişmesi gerekiyor ve ihtiyaçtan 6 kolon var her satırda.

Döküman kayıtlarını listelerken kullanıcının *manager* bilgilerininin
*filtrelenip* listelenmesi gerekiyor.Çünkü her yönetici kendisine ait alt
kullanıcıların dökümanlarını görebilmesi gerekiyor.

Mongodb'de text halinde eklenip indexlendiğinde performans sıkıntısı
çıkarmıyor.

*Sormak istediğim yukardaki tablo yapısı hatalımı? kayıt sayısına göre.*
Aktif sistemde *documents* tablosunda epey bir read oluyor bazı zamanlarda.

Yükü anlatabilmek için grafikleri paylaşıyorum.
Son yedi güne ait mongodb :
https://gyazo.com/79553634f83460ef7352fb1595c27838.png
Son yedi güne ait mysql
https://gyazo.com/f0303d7badcb6ccce13c0b3a6019dd88.png

Sadece members kısmını listelemek için.2 farklı sorgu yazdım biri join biri
de sub-query.

// sorgu 1 join style explain sonucu https://explain.depesz.com/s/aJC6

SELECT u.username,
j.username AS jmanager,
s.username AS smanager,
m.username AS manager
FROM members AS u
left join members AS j
ON u.joker_manager_id = j.id
left join members AS s
ON u.super_manager_id = s.id
left join members AS m
ON u.manager_id = m.id

// sorgu 2 sub query explain sonucu https://explain.depesz.com/s/aalc

SELECT u.username,
(SELECT j.username
FROM members j
WHERE j.id = u.id) AS jmanager,
(SELECT s.username
FROM members s
WHERE s.id = u.id) AS smanager,
(SELECT m.username
FROM members m
WHERE m.id = u.id) AS manager
FROM members u

Bu şekilde index oluşturdum fakat yukardaki sorgularda herhangi bir
performans artışı olmadı.

CREATE INDEX "members_super_manager_id" ON
"public"."members"("super_manager_id");
CREATE INDEX "members_joker_manager_id" ON
"public"."members"("joker_manager_id");
CREATE INDEX "members_manager_id" ON "public"."members"("manager_id");

Acaba mongodb'deki gibi 6 extra kolon açarsam dahamı performanslı olacaktır?

Eskisi gibi kullanıcı document eklerken manager bilgilerinide birlikte
kaydetmek.
yada document eklendiğinde trigger ile ekleyen kullanıcının manager
bilgilerini eklemek.

*Documents* tablosunu members ile joinlersem nasıl bir şey olacak henüz
bilmiyorum.
*Documents* test datası oluşturup bakacağım fakat tablo yapısından tam emin
olamadım bu yüzden deneyimli arkadaşların yardımlarına *ihtiyacım* var. .

*members* test datası https://paste.ubuntu.com/26302697/

Yardımlarınızı ve yorumlarınızı bekliyorum.
Şimdiden Teşekkür Ederim.

Kadir

Browse pgsql-tr-genel by date

  From Date Subject
Next Message AZiZ CiZMECi 2018-02-04 15:43:26 Postgresql Function içinde array nasıl kullanılır?
Previous Message İhsan Yiğitbaşı 2017-12-28 17:33:00 DBA Pozisyonları - İş İlanı