Sequelize, NodeJs tabanlı bir ORM (Object-Relational Mapping) yazılımıdır. Veritabanı yapılarını Obje ve onun fonksiyonlarına çevirerek, kod içerisinde direkt SQL query’leri yazmadan, kod tarafında işin halledilme olayıdır kısaca. Yani veritabanı bizim bir objemiz olur ve orm’deki methodlar vasıtasıyla CRUD işlemleri gerçekleştirebiliriz.
Sequelize’da 4 adet ilişki türü vardır, bunlar hasOne,hasMany,belongsTo ve belongsToMany’dir. SQL tablolarımızdaki ilişkilerimizden yola çıkarak relationship yapısını bu dört yöntem/method ile halledebiliriz. Bunların kullanım mantığı, tablomuzdaki target(hedef) ve source(kaynak) tablo yapısına göre ayarlanır. Şimdi yazımızın en önemli kısımlarından biri olan target ve source tablomuz hakkında konuşalım.
Yukarıdaki örnek instructor ve subject tablomuza baktığımızda, bir one to one relationship örneği görüyoruz. Bu tabloda bizim target yani hedef tablomuz, Instructor tablosu ve source yani kaynak tablomuz Subject tablosu. Subject(source) tablosundan Instructor(target) tablosuna bir one-to-one ilişkimiz var.
Aşağıdaki tablomuzda ise gördüğümüz üzere bir one to many ilişkimiz var ve görüldüğü üzere Instructor’dan Class’a gidiyoruz, yani burada ise Instructor tablomuzun bizim source tablomuz olduğunu ve Class tablomuzun target tablomuz olduğunu görüyoruz.
Aynı şekilde many to many tablomuz da benzer bir ilişki içerisinde. Burada ise Student ve Class tablolarımız bizim source tablolarımız ve aradaki orta tablomuz ise bizim target tablomuz.
Source ve Target tablomuzu nasıl belirlediğimizi bulduktan sonra sırada bu dört ilişkiyi nasıl kullanabileceğimiz kuralına geliyoruz. Bu kural iki adet maddeden oluşuyor ve sequelize’da relationship’leri ayarlamamız için bu iki kural’dan yola çıkacağız.
Kurallar
[ Source model ] . [ İlişki Türü ] ([ Target model ],options objesi)
Yani bu kurallardan yola çıkarak şöyle özetleyebiliriz; Eğer bizim yabancı anahtarımız, ana tabloda ise, belongsTo veya belontsToMany kullanıyoruz, eğer karşı tabloda ise hasOne ve hasMany kullanıyoruz.
Tablomuz Ve İlişkilerimiz
Yukarıdaki veritabanı tasarımımızda source ve target tablolarını belirleyerek işe başlıyoruz.
Kurulum
Eğer bir sequelize projesini nasıl kuracağınızı merak ediyorsanız, MDP’de yazılım geliştirici olan Burak Yılmazer’in Sequelize Nedir yazısına ulaşarak, kurulumu yapabilirsiniz. Bizim burada asıl amacımız sequelize’da ilişkileri kullanarak bir örnek yapmak. Bu yüzden kurulum adımlarını atlıyorum.
Komut satırından ‘sequelize init’ yaparak projemizi başlatıyoruz ve bize bir proje yapısı getiriyor. Bu proje yapımız, config,migrations,models şeklinde geliyor. app.js’i projeyi test etmek ve route’ları ayarlamak için kendim oluşturdum.
İlk olarak işe config.json’ı ayarlayarak başlıyoruz. Bu dosyayı doğru ayarlamamız veritabanına bağlanabilmemiz için önemli. Ben aşağıda gördüğünüz gibi lokal ortamımdaki postgres’e bu şekilde bağlandım. Developmen modda çalışacağımız için sadece development modu değiştirsek şimdilik yeterli olur.
Komut satırından sequelize db:create diyerek database’imizi postgres içerisinde sequelize orm paketimiz aracılığıyla oluşturuyoruz.
Model oluşturmak
Model’lerimizi oluşturarak işe başlıyoruz. Bu model’ler bizim SQL’de entity diye tabir ettiğimiz verilerdir.
Şu kodları sırasıyla yazarak Modellerimizi oluşturabiliriz.
Student’imiz name,surname ve email alacak ve class harici bir yere bağlı olmayacak, o modeli şu şekilde oluşturuyoruz:
sequelize model generate --name Student --attributes name:string,surname:string,email:string
Class’ımız hem Instructor’a hem de Student’a bağlı olacak. İçinde foreign key olarak instructorId tutacak yani class’a bir sorgu attığımızda instructorId’de beraberinde gelecek.O modeli bu şekilde oluşturuyoruz.
sequelize model:generate --name Class --attributes instructorId:integer,classCode:string
StudentClass tablomuz many-to-many ilişki içinde olduğundan dolayı, bir ara tablo sayılacak ve classId ve studentId’yi tutacak.Onu bu şekilde oluşturabiliriz:
sequelize model:generate --name StudentClass --attributes classId:integer,studentId:integer
Instructor ile Subject arasında bir One to One ilişki olduğu için, Instuctor’ın içinde bir foreign key olan SubjectId’yi tutuyoruz. Böylece Instrutor’a sorgu attığımızda bize subjectId’yi de getirecek, böylece sequelize’dan tek sorgu’da her iki özelliğe de ulaşabileceğiz. Kodu şu şekilde oluşturabiliriz.
sequelize model:generate --name Instructor --attributes instructorDegree:string,name:string,surname:string,subjectId:integer
Son olarak Subject öğretmenlerde belirtileceği için, sadece name içerek, kodunu bu şekilde oluşturabiliriz:
sequelize model:generate --name Subject --attributes subjectName:string
Daha sonra komut satırından db:migrate komutunu çalıştırdığımızda, bu modeller üzerinde migration oluşturup, modeli kalıcı olarak database’e kaydeder. Şuraya dikkat etmekte fayda var, model isimlerini her ne kadar tekil olarak kod üzerinde generate(oluşturmak) etsek de, bunlar SQL’de çoğul ve büyük harf olarak geçebilir, bunun da çözümü, eğer tabloda bir bütünlük sağlamak istiyorsak, daha sonradan bu class’a tableName parametresi vererek bu bütünlüğü sağlabiliriz.
Örnek bir student tablosunun model ve tablo name’i şu şekilde olabilir:
One To One İlişki
One-to-One ilişki, bir kaynak modelin (source model) bir hedef modeli (target model) ile sadece bir kez ilişkili olabileceğini belirtir. Yukarıda target ve source’dan bahsettiğimiz için şimdi işimiz daha kolay olacak. Source modelimiz Subject ve target modelimiz Instructor, foreign key’imiz ise target tablomuzda, bu yüzden hasOne kullanıyoruz.
subject.js
Bağlantımızı gerçekleştirebilmemiz için yabancı anahtarı oluşturduğunuz modelin migration dosyasında, diğer modeline (referred model) references vermeniz gerekmektedir. Örneğin, Instructor modelinde bir Subject'e ait olma ilişkisi oluşturduysanız, Instructor modelinin migration dosyasında Subject modeline reference vermeniz gerekir. Bu, Instructor tablosunun Subject tablosundaki bir satıra referans etmesini sağlar ve Instructor'ın Subject ile ilişkili olduğunu gösterir.
20230201071547-create-instructor.js:
Many To One İlişki
Many-to-One ilişki, bir kaynak modelin(source), bir hedef modeli ile(target), birden fazla ilişkili olabileceği anlamına gelir. Burada bizim source modelimiz Instructor ve target modelimiz Class. Foreign key’imizin target modelde olduğunu görüyoruz. Bu yüzden kullanacağımız ilişki türü hasMany. Tam tersi taraftan bağlamak istediğimizde ise source tablomuz değişeceği için ve foreign key’imiz de source tablomuzda olduğu için, belongTo ilişkisini kullanacağız.
instructor.js
class.js
Bağlantımızı gerçekleştirebilmemiz için yabancı anahtarı oluşturduğunuz modelin migration dosyasında, diğer modeline (referred model) references vermeniz gerekmektedir. Örneğin, Class modelinde bir Instructor'a ait olma ilişkisi oluşturduysanız, Class modelinin migration dosyasında Instructor modeline references vermeniz gerekir. Bu, Class tablosunun Instructor tablosundaki bir satıra referans etmesini sağlar ve Class'ın Instructor ile ilişkili olduğunu gösterir.
20230201071158-create-class.js
Many to Many ilişki
Many-to-Many ilişkimizde bir istisna vardı. Bu ilişkide source modelimizden target ara tablomıza gitmemize ve foreign key’lerin ana tabloda olmasına rağmen , sequelize’ın kuralları gereği belongsToMany vermeliydik. Her iki tablodaki verilere de birbiri aracılığı ile ulaşmak için hem Class hem Student tablomuzda bunu yapabiliriz.
student.js
Son olarak studentclass migration dosyamızın içine referans vererek, bu satırları tablomuzun içinde oluşturup bağlantımızı tamamlıyoruz.
20230201071320-create-student-class.js
Github repom’daki kodların tamamına bu linkten ulaşabilirsiniz.
Tablonun çizimine ise Lucidchart üzerinden ulaşabilirsiniz.
Yazılım Geliştiricisi
E-Arşiv Fatura Nasıl İptal Edilir?
01/01/2020 itibarıyla e-Fatura mükelleflerine, vergi mükellefi olmayan ancak aynı gün içinde 30 bin TL’nin üzerinde fatura kesen ve aynı...
Depo Lojistiği Nedir?
Depo lojistiği, bir deponun günlük operasyonlarının yönetimidir. Etkili bir şekilde yönetildiği takdirde bir şirketin depo süreçlerini...
Azure Adapter’ın SAP Integration Suite’de Rolü
Microsoft Azure Nedir?Microsoft Azure, Microsoft'un bulut bilişim platformudur ve 2010 yılında kullanıma sunulmuştur. Şirketlerin ve...
e-İrsaliye Hakkında Sıkça Sorulan Sorular
e-İrsaliye Nedir? e-İrsaliye, bir malın taşınması veya başka bir depoya sevk edilme sürecinde hazırlanması zorunlu tutulan irsaliye...
Şirketinizi e-Dönüşüme Taşımanız İçin 5 Sebep
E-Dönüşüm yöntemleri: e-Arşiv, e-Fatura, e-Defter, e-İrsaliye, e-Muatabakat ve daha bir çok çözümle birlikte iş dünyasında her geçen...
Sequelize ile Tablo İlişkileri Nasıl Yapılır?
Sequelize Nedir?Sequelize, NodeJs tabanlı bir ORM (Object-Relational Mapping) yazılımıdır. Veritabanı yapılarını Obje ve onun...
Go Programlama Diline Giriş
Go Nedir? Go, Google mühendisleri tarafından 2007 yılında geliştirilmeye başlanan, kendi tabirleri ile basit, güvenilir ve verimli uygulamalar...
Çevik Proje Yönetimi Nedir?
Proje yöneticilerinin projeleri en iyi şekilde yürütmek için seçebilecekleri birçok proje yönetimi metodolojisi bulunmaktadır. Bu...
Tarafınıza Düzenlenen e-Arşiv Faturalar Nasıl Görüntülenir?
Gelir İdaresi Başkanlığı’nın (GİB), her yıl yaptığı düzenlemeler ile zorunluluk kapsamında e-arşiv sistemine geçiş için belirlenen...
Mailiniz başarıyla gönderilmiştir en kısa sürede sizinle iletişime geçilecektir.
Mesajınız ulaştırılamadı! Lütfen daha sonra tekrar deneyin.