mysql-trigger-use-case

MySQL – Gerçek Hayat Senaryosu Üzerinden Trigger Kullanımı

MySQL veritabanı yönetim sisteminde, veri tutarlılığını sağlamak ve işlemleri otomatikleştirmek için trigger’lar oldukça kullanışlıdır. Bu makalede, gerçek bir hayat senaryosu üzerinden trigger kullanımını inceleyeceğiz. Konumuz etkinlikler, bu etkinliklerle ilgili detaylar ve kullanıcıların bu etkinliklere katılımının takip edilmesidir. İlgili trigger’ların nasıl oluşturulduğunu ve işlevlerini ayrıntılı bir şekilde ele alacağız.

Senaryonun Tanıtımı

Senaryomuzda, bir etkinlik yönetim sistemimiz var. Bu sistemde çeşitli etkinlikler düzenleniyor ve bu etkinliklerle ilgili çeşitli detaylar bulunuyor: kavramlar, kazanımlar, çeşitler, belirli günler vb. Ayrıca her kullanıcı, belirli etkinliklere katılıyor ve bu katılım bilgileri UserEvents tablosunda tutuluyor. Kullanıcıların her bir etkinlik için sahip oldukları detaylar (kavram, kazanım, çeşit, belirli gün gibi) ayrı ayrı takip ediliyor.

Veritabanımızda ana tablolar ve ilişkiler şu şekildedir:

1. Events: Etkinliklerin temel bilgilerini tutar.

2. EventDates: Etkinliklerin tarih bilgilerini tutar.

3. DefaultEventsOfUser: Kullanıcıların varsayılan etkinlik tarihlerini tutar.

4. UserEvents: Hangi kullanıcının hangi etkinliğe katıldığını tutar.

5. UserEventDetails: Kullanıcıların etkinliklerle ilgili detaylarını tutar.

Trigger Kullanımı ve Uygulama Senaryoları

1. Yeni Etkinlik Eklendiğinde Varsayılan Tarih Ekleme

Yeni bir etkinlik EventDates tablosuna eklendiğinde, bu etkinliği tüm kullanıcılara varsayılan tarih olarak ekleyen bir trigger oluşturduk. Bu trigger, DefaultEventsOfUser tablosuna yeni kayıt ekler. Dolayısıyla eğer yetkili kullanıcı yeni bir etkinlik tarihi eklediğinde bütün kullanıcıların etkinliklerine bu tarih eklenmiş oluyor. Böylece veri tutarlılığını sağlamış oluyor.

CREATE TRIGGER add_default_event_date
AFTER INSERT ON EventDates
FOR EACH ROW
BEGIN
    INSERT IGNORE INTO DefaultEventsOfUser (UserId, EventId, Date)
    SELECT DISTINCT UserId, NEW.EventId, NEW.Date
    FROM DefaultEventsOfUser
    WHERE UserId NOT IN (
        SELECT DISTINCT UserId
        FROM DefaultEventsOfUser
        WHERE EventId = NEW.EventId AND Date = NEW.Date
    );
END;

2. Kullanıcı Etkinlik Detaylarının Güncellenmesi

Bir kullanıcının etkinlik tarihi UserEvents tablosuna eklendiğinde, etkinliğin genel detaylarının kullanıcıya özel detaylara kopyalanmasını sağlayan bir trigger oluşturduk.

CREATE TRIGGER copy_event_details_to_user_event
AFTER INSERT ON UserEvents
FOR EACH ROW
BEGIN
    INSERT IGNORE INTO UserEventDetails (UserId, EventId, Concept, Achievement, Type, SpecificDay)
    SELECT NEW.UserId, e.EventId, e.Concept, e.Achievement, e.Type, e.SpecificDay
    FROM Events e
    WHERE e.EventId = NEW.EventId;
END;

Bu trigger, yeni eklenen kullanıcı etkinliğinin detaylarını UserEventDetails tablosuna kopyalar. Bu sayede, kullanıcılar etkinlik detaylarına erişebilirler.

3. Etkinlik Silindiğinde Kullanıcı Etkinliklerinin Temizlenmesi

Bir etkinlik Events tablosundan silindiğinde, bu etkinliğe ait tüm kullanıcı etkinliklerini de silen bir trigger oluşturduk. Bu işlem, veritabanındaki ilişkilerin tutarlılığını korur. Eğer Events tablosundaki EventsId ile diğer tabloların EventsId’leri üzerinde bir foreign key ilişkisi kurmuş olsaydık ve bu key üzerinde cascade tipini belirlemiş olsaydık bunu yapmaya ihtiyaç duymazdık. Bunun amacı iki tablo arasında ilişki belirlemeyerek performans ve hız kazanmak.

CREATE TRIGGER delete_user_events_on_event_delete
AFTER DELETE ON Events
FOR EACH ROW
BEGIN
    DELETE FROM UserEvents WHERE EventId = OLD.EventId;
    DELETE FROM DefaultEventsOfUser WHERE EventId = OLD.EventId;
END;

4. Silinen Etkinlikleri Varsayılan Tablosundan Kaldırma

Bir etkinlik EventDates tablosundan silindiğinde, bu etkinliği DefaultEventsOfUser tablosundan kaldıran bir trigger oluşturduk. Böylece eğer etkinlikten onun düzenleneceği tarihi kaldırırsak, her kullanıcının default olarak eklemiş olduğu etkinliklerden de tarihi kaldırmamız gerek. Bu sayede veri tutarlılığı sağlamış oluyoruz.

CREATE TRIGGER remove_default_event_date
AFTER DELETE ON EventDates
FOR EACH ROW
BEGIN
    DELETE FROM DefaultEventsOfUser
    WHERE EventId = OLD.EventId AND Date = OLD.Date;
END;

5. Yeni Etkinlik Eklendiğinde Varsayılan Tabloya Ekleme

Yeni bir etkinlik EventDates tablosuna eklendiğinde, bu etkinliği DefaultEventsOfUser tablosuna ekleyen bir trigger oluşturduk. Bu da silmenin tam tersi olarak eğer yeni etkinlik eklediysek bunu bütün kullanıcılar için eklemiş oluyor.

CREATE TRIGGER add_default_event_date
AFTER INSERT ON EventDates
FOR EACH ROW
BEGIN
    INSERT IGNORE INTO DefaultEventsOfUser (UserId, EventId, Date)
    SELECT DISTINCT UserId, NEW.EventId, NEW.Date
    FROM DefaultEventsOfUser
    WHERE UserId NOT IN (
        SELECT DISTINCT UserId
        FROM DefaultEventsOfUser
        WHERE EventId = NEW.EventId AND Date = NEW.Date
    );
END;

Trigger’ların Faydaları ve Performans Etkileri

Trigger’lar, veri tutarlılığını sağlamada ve otomatikleştirilmiş işlemler gerçekleştirmede oldukça etkilidir. Yukarıdaki örneklerde, veri tutarlılığını sağlamak ve işlemleri kolaylaştırmak için trigger’lar kullandık. Ancak, trigger’ların performansa etkisi de göz önünde bulundurulmalıdır. Özellikle büyük veri tabanlarında, fazla sayıda trigger kullanımı, veritabanı performansını olumsuz etkileyebilir. Bu nedenle, trigger kullanımı dikkatli planlanmalı ve optimize edilmelidir.

Sonuç

Bu makalede, MySQL’de trigger kullanımını gerçek bir hayat senaryosu üzerinden inceledik. Etkinlik yönetim sistemimizde, kullanıcıların etkinlik katılım bilgilerini ve detaylarını otomatik olarak güncelleyen ve veri tutarlılığını sağlayan çeşitli trigger’lar oluşturduk. Bu trigger’lar, veri tutarlılığını sağlarken, aynı zamanda yönetimi de kolaylaştırır. Ancak, trigger’ların performansa etkisi göz önünde bulundurulmalı ve veritabanı yapısı buna göre optimize edilmelidir. Okuduğunuz için teşekkür eder esenlikler dilerim 🙂

Leave a Comment

Your email address will not be published. Required fields are marked *