Bu ders için video bulunmamaktadır.
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ütunlar | Belge, anahtar-değer, grafik, sütun ailesi |
Şema | Önceden tanımlanmış, katı şema | Dinamik, esnek şema |
Ölçeklenebilirlik | Dikey (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