Bu ders için video bulunmamaktadır.

Bu derse başlamak veya ilerlemenizi kaydetmek için lütfen giriş yapın veya kayıt olun.

Ders İçeriği

Veritabanı Nedir ve Neden Kullanılır?

Veritabanı, yapılandırılmış bilgileri veya verileri elektronik olarak bir bilgisayar sisteminde depolamak için kullanılan organize bir koleksiyondur. Veritabanları, büyük miktarda veriyi verimli bir şekilde depolamak, yönetmek ve almak için tasarlanmıştır.

Neden Veritabanı Kullanmalıyız?

  • **Veri Kalıcılığı:** Uygulama kapansa bile verilerin saklanmasını sağlar.
  • **Veri Bütünlüğü:** Verilerin doğru, tutarlı ve güvenilir olmasını sağlar.
  • **Veri Erişimi:** Verilere hızlı ve kolay erişim imkanı sunar.
  • **Veri Güvenliği:** Yetkisiz erişimi önlemek için güvenlik mekanizmaları sağlar.
  • **Veri Paylaşımı:** Birden fazla kullanıcının veya uygulamanın aynı verilere erişmesini sağlar.

Veritabanı Türleri

İki ana veritabanı türü vardır: İlişkisel Veritabanları (SQL) ve İlişkisel Olmayan Veritabanları (NoSQL).

İlişkisel Veritabanları (SQL)

İlişkisel veritabanları, verileri önceden tanımlanmış ilişkilerle tablolar halinde düzenler. SQL (Structured Query Language) kullanılarak veriler sorgulanır ve yönetilir. Örnekler: MySQL, PostgreSQL, Oracle, SQL Server.

İlişkisel Olmayan Veritabanları (NoSQL)

NoSQL veritabanları, ilişkisel veritabanlarından farklı olarak, verileri tablo yapısında depolamaz. Daha esnek şemalara sahiptirler ve büyük ölçekli, dağıtık veri depolama için uygundurlar. Örnekler: MongoDB (Belge tabanlı), Cassandra (Sütun tabanlı), Redis (Anahtar-değer), Neo4j (Grafik tabanlı).

MongoDB ve Mongoose

MongoDB, popüler bir NoSQL, belge tabanlı veritabanıdır. Verileri JSON benzeri BSON formatında depolar. Mongoose ise Node.js için bir MongoDB nesne modelleme aracıdır (ODM). MongoDB ile çalışmayı kolaylaştıran şema tabanlı bir çözüm sunar.

Kurulum ve Bağlantı

npm install mongoose
const mongoose = require("mongoose");

mongoose.connect("mongodb://localhost:27017/mydatabase", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
})
.then(() => console.log("MongoDB bağlantısı başarılı!"))
.catch((err) => console.error("MongoDB bağlantı hatası:", err));

Şema ve Model Oluşturma

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
    unique: true,
  },
  age: {
    type: Number,
    min: 18,
  },
  createdAt: {
    type: Date,
    default: Date.now,
  },
});

const User = mongoose.model("User", userSchema);

module.exports = User;

CRUD İşlemleri (Create, Read, Update, Delete)

const User = require("./models/User"); // User modelini import edin

// Yeni kullanıcı oluşturma (Create)
async function createUser(name, email, age) {
  try {
    const newUser = new User({ name, email, age });
    const savedUser = await newUser.save();
    console.log("Yeni kullanıcı oluşturuldu:", savedUser);
    return savedUser;
  } catch (err) {
    console.error("Kullanıcı oluşturma hatası:", err);
  }
}

// Tüm kullanıcıları okuma (Read)
async function getAllUsers() {
  try {
    const users = await User.find();
    console.log("Tüm kullanıcılar:", users);
    return users;
  } catch (err) {
    console.error("Kullanıcıları okuma hatası:", err);
  }
}

// Kullanıcı güncelleme (Update)
async function updateUser(id, newAge) {
  try {
    const updatedUser = await User.findByIdAndUpdate(
      id,
      { age: newAge },
      { new: true } // Güncellenmiş belgeyi döndür
    );
    console.log("Kullanıcı güncellendi:", updatedUser);
    return updatedUser;
  } catch (err) {
    console.error("Kullanıcı güncelleme hatası:", err);
  }
}

// Kullanıcı silme (Delete)
async function deleteUser(id) {
  try {
    const deletedUser = await User.findByIdAndDelete(id);
    console.log("Kullanıcı silindi:", deletedUser);
    return deletedUser;
  } catch (err) {
    console.error("Kullanıcı silme hatası:", err);
  }
}

// Örnek Kullanım
// (async () => {
//   await createUser("Ali Can", "ali@example.com", 30);
//   await getAllUsers();
//   await updateUser("60c72b2f9b1e8c001c8e4d7a", 31); // Gerçek bir ID kullanın
//   await deleteUser("60c72b2f9b1e8c001c8e4d7a"); // Gerçek bir ID kullanın
// })();

PostgreSQL ve Sequelize

PostgreSQL, güçlü ve açık kaynaklı bir ilişkisel veritabanı yönetim sistemidir. Sequelize ise Node.js için popüler bir ORM (Object-Relational Mapper) aracıdır. Sequelize, SQL sorgularını JavaScript objeleriyle yazmanıza olanak tanır ve veritabanı işlemlerini basitleştirir.

Kurulum ve Bağlantı

npm install sequelize pg pg-hstore
const { Sequelize, DataTypes } = require("sequelize");

const sequelize = new Sequelize(
  "postgres://user:password@localhost:5432/mydatabase",
  {
    dialect: "postgres",
  }
);

async function connectPostgreSQL() {
  try {
    await sequelize.authenticate();
    console.log("PostgreSQL bağlantısı başarılı!");
  } catch (error) {
    console.error("PostgreSQL bağlantı hatası:", error);
  }
}

connectPostgreSQL();

Model Tanımlama

const { Sequelize, DataTypes } = require("sequelize");
const sequelize = new Sequelize("sqlite::memory:"); // Örnek için bellek içi SQLite

const User = sequelize.define("User", {
  firstName: {
    type: DataTypes.STRING,
    allowNull: false,
  },
  lastName: {
    type: DataTypes.STRING,
  },
  email: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true,
  },
});

module.exports = User;

CRUD İşlemleri

const User = require("./models/User"); // User modelini import edin
const sequelize = require("./config/database"); // Sequelize bağlantısını import edin

// Veritabanını senkronize et (tabloları oluştur/güncelle)
async function syncDatabase() {
  await sequelize.sync({ force: true }); // force: true mevcut tabloları siler ve yeniden oluşturur
  console.log("Veritabanı senkronize edildi.");
}

// Yeni kullanıcı oluşturma (Create)
async function createUser(firstName, lastName, email) {
  try {
    const newUser = await User.create({ firstName, lastName, email });
    console.log("Yeni kullanıcı oluşturuldu:", newUser.toJSON());
    return newUser;
  } catch (err) {
    console.error("Kullanıcı oluşturma hatası:", err);
  }
}

// Tüm kullanıcıları okuma (Read)
async function getAllUsers() {
  try {
    const users = await User.findAll();
    console.log("Tüm kullanıcılar:", users.map(u => u.toJSON()));
    return users;
  } catch (err) {
    console.error("Kullanıcıları okuma hatası:", err);
  }
}

// Kullanıcı güncelleme (Update)
async function updateUser(id, newEmail) {
  try {
    const [updatedRows] = await User.update(
      { email: newEmail },
      { where: { id: id } }
    );
    if (updatedRows > 0) {
      const updatedUser = await User.findByPk(id);
      console.log("Kullanıcı güncellendi:", updatedUser.toJSON());
      return updatedUser;
    } else {
      console.log("Kullanıcı bulunamadı veya güncellenmedi.");
      return null;
    }
  } catch (err) {
    console.error("Kullanıcı güncelleme hatası:", err);
  }
}

// Kullanıcı silme (Delete)
async function deleteUser(id) {
  try {
    const deletedRows = await User.destroy({
      where: { id: id },
    });
    if (deletedRows > 0) {
      console.log("Kullanıcı silindi.");
      return true;
    } else {
      console.log("Kullanıcı bulunamadı veya silinmedi.");
      return false;
    }
  } catch (err) {
    console.error("Kullanıcı silme hatası:", err);
  }
}

// Örnek Kullanım
// (async () => {
//   await syncDatabase();
//   const user1 = await createUser("Ayşe", "Yılmaz", "ayse@example.com");
//   await getAllUsers();
//   await updateUser(user1.id, "ayse.yeni@example.com");
//   await deleteUser(user1.id);
// })();

İlişkisel ve NoSQL Veritabanları Karşılaştırması

Hangi veritabanı türünü seçeceğiniz, projenizin gereksinimlerine bağlıdır. İşte iki tür arasındaki temel farklar:

Özellikİlişkisel (SQL)İlişkisel Olmayan (NoSQL)
YapıTablolar, satırlar, sütunlarBelge, anahtar-değer, grafik, sütun ailesi
ŞemaÖnceden tanımlanmış, katı şemaDinamik, esnek şema
ÖlçeklenebilirlikDikey (daha güçlü sunucu)Yatay (daha fazla sunucu)
Veri Modeliİlişkisel veri (JOIN işlemleri)Hiyerarşik, ağ veya grafik veri
Kullanım AlanlarıFinans, envanter, geleneksel iş uygulamalarıBüyük veri, gerçek zamanlı uygulamalar, içerik yönetim sistemleri


Pratik Alıştırma: Kullanıcı Yönetim Sistemi

Bu alıştırmada, seçtiğiniz bir veritabanı (MongoDB veya PostgreSQL) ile basit bir kullanıcı yönetim sistemi oluşturacaksınız. Uygulama aşağıdaki özelliklere sahip olmalıdır:

  • Kullanıcı ekleme (ad, e-posta, yaş)
  • Tüm kullanıcıları listeleme
  • Kullanıcı bilgilerini güncelleme
  • Kullanıcı silme
  • Veritabanı bağlantılarını ve hatalarını yönetme