Kendi geliştirdiğim veritabanı sisteminin performansı nasıl olur?

Mucosoft

Megapat
Katılım
5 Mart 2014
Mesajlar
5.514
Makaleler
12
Çözümler
41
Daha önce üstteki başlığı oluşturmuştum ama sanırım bu mümkün değil. Ben, panelde birden fazla yazılım çalıştıramıyorum. Çünkü güvenlik amaçlı yetki kısıtlamaları var. NodeJS, JAVA veya PHP olsun hangi dil olursa olsun ben genel olarak bu soruyu soruyorum.

Kendi veritabanı sistemimi geliştirmek isterim. Yapay zekaya sordum, bana JSON tabanlı veritabanı sistemi önerdi. Kodu aşağıdaki yer alıyor.
JavaScript:
const fs = require('fs');

class SimpleDatabase {
  constructor(databaseName) {
    this.databaseName = databaseName;
    this.data = {};

    this.loadDatabase();
  }

  // Veritabanı oluşturma veya yükleme
  loadDatabase() {
    try {
      const data = fs.readFileSync(`${this.databaseName}.json`, 'utf8');
      this.data = JSON.parse(data);
    } catch (err) {
      // Eğer dosya yoksa veya bir hata oluşursa yeni bir veritabanı oluştur
      this.saveDatabase();
    }
  }

  // Veritabanı adını güncelleme
  updateDatabaseName(newName) {
    this.databaseName = newName;
    this.saveDatabase();
  }

  // Veritabanı kaydetme
  saveDatabase() {
    fs.writeFileSync(`${this.databaseName}.json`, JSON.stringify(this.data, null, 2), 'utf8');
  }

  // Veritabanı kaldırma
  dropDatabase() {
    fs.unlinkSync(`${this.databaseName}.json`);
    this.data = {};
  }

  // Tablo oluşturma
  createTable(tableName, columns) {
    this.data[tableName] = { columns, rows: [] };
    this.saveDatabase();
  }

  // Veri ekleme
  insertData(tableName, rowData) {
    this.data[tableName].rows.push(rowData);
    this.saveDatabase();
  }

  // Veri güncelleme
  updateData(tableName, rowIndex, updatedData) {
    this.data[tableName].rows[rowIndex] = updatedData;
    this.saveDatabase();
  }

  // Veri kaldırma
  deleteData(tableName, rowIndex) {
    this.data[tableName].rows.splice(rowIndex, 1);
    this.saveDatabase();
  }

  // Veri seçme
  selectData(tableName) {
    return this.data[tableName].rows;
  }
}

// Örnek kullanım
const myDatabase = new SimpleDatabase('myDatabase');

myDatabase.createTable('users', ['id', 'name', 'age']);
myDatabase.insertData('users', { id: 1, name: 'John Doe', age: 25 });
myDatabase.insertData('users', { id: 2, name: 'Jane Doe', age: 30 });

console.log('Before Update:');
console.log(myDatabase.selectData('users'));

myDatabase.updateData('users', 0, { id: 1, name: 'Updated John Doe', age: 26 });

console.log('\nAfter Update:');
console.log(myDatabase.selectData('users'));

myDatabase.deleteData('users', 1);

console.log('\nAfter Delete:');
console.log(myDatabase.selectData('users'));

// Veritabanını kaldırma
// myDatabase.dropDatabase();

Bu yöntemin MySQL kadar performansının yüksek olmayacağını düşünüyorum. Bunun için veritabanını klasöre çevirme ve klasör içinde tablo dosyaları yerleştirmeyi düşündüm ama yine de size de bir sorayım diyorum. Örneğin tek tablo dosyasında 1.000 veya 10.000 tane veri olduğunda performans ne ölçüde etkilenir? Daha iyi bir yöntem bulunuyor mu? Sistemi kendim kodlamak istiyorum, farklı bir yazılım tavsiye etmeyin. NodeJS tabanlı bir kütüphane olursa önerebilirsiniz.
 
Böyle bir şey işinizi görür mü?
 
Böyle bir şey işinizi görür mü?
Evet. MySQL veritabanımın boyutu 3,5 MB. SQLite geçişi sonrasında performansı yüksek olur mu?
 
Yaptığınız şeye veritabanı sistemi demek biraz zor. Veri tutuyor mu, evet, getir deyince getiriyor mu, o da evet. Veritabanı sisteminin çeşitli özellikleri vardır, indexleme, ACID, authentication, relational dblerde foreign keyler vs. yoksa zaten veritabanı yerine metin dosyalarına kaydederdik bilgilerimizi bundan 50 sene önce yapıldığı gibi.

Kişisel projeniz için ise ve az miktarda veri ile kullanacaksanız crud işlemlerini böyle yapmak eğlencelik bir iş olur, veritabanı lazım ise diğer arkadaşın dediği gibi sqlite güzel bir çözüm.
 
Veritabanı lazım ise diğer arkadaşın dediği gibi SQLite güzel bir çözüm.
Sanırım SQLite ile aynı anda birden fazla işlem yapılamıyormuş. Örneğin 10 işlem yapılacak, hepsi sıraya alınıp teker teker yapılıyor. Ben bu sistemi kullandığımda gecikme yapar mı?
 
Sanırım SQLite ile aynı anda birden fazla işlem yapılamıyormuş. Örneğin 10 işlem yapılacak, hepsi sıraya alınıp teker teker yapılıyor. Ben bu sistemi kullandığımda gecikme yapar mı?
Aynı anda 10 işlem gelecek bir trafik bekleniyorsa normal, bilindik sql, mongo vb. bir db kullanın, sqlite'ın yük karşısındaki performansıyla ünlü olduğunu düşünmüyorum, trafik olmayacak mobil oyun vb. yapıyorsanız telefonda az biraz veri tutmak için uygun olur.
 
Daha önce üstteki başlığı oluşturmuştum ama sanırım bu mümkün değil. Ben, panelde birden fazla yazılım çalıştıramıyorum. Çünkü güvenlik amaçlı yetki kısıtlamaları var. NodeJS, JAVA veya PHP olsun hangi dil olursa olsun ben genel olarak bu soruyu soruyorum.

Kendi veritabanı sistemimi geliştirmek isterim. Yapay zekaya sordum, bana JSON tabanlı veritabanı sistemi önerdi. Kodu aşağıdaki yer alıyor.
JavaScript:
const fs = require('fs');

class SimpleDatabase {
  constructor(databaseName) {
    this.databaseName = databaseName;
    this.data = {};

    this.loadDatabase();
  }

  // Veritabanı oluşturma veya yükleme
  loadDatabase() {
    try {
      const data = fs.readFileSync(`${this.databaseName}.json`, 'utf8');
      this.data = JSON.parse(data);
    } catch (err) {
      // Eğer dosya yoksa veya bir hata oluşursa yeni bir veritabanı oluştur
      this.saveDatabase();
    }
  }

  // Veritabanı adını güncelleme
  updateDatabaseName(newName) {
    this.databaseName = newName;
    this.saveDatabase();
  }

  // Veritabanı kaydetme
  saveDatabase() {
    fs.writeFileSync(`${this.databaseName}.json`, JSON.stringify(this.data, null, 2), 'utf8');
  }

  // Veritabanı kaldırma
  dropDatabase() {
    fs.unlinkSync(`${this.databaseName}.json`);
    this.data = {};
  }

  // Tablo oluşturma
  createTable(tableName, columns) {
    this.data[tableName] = { columns, rows: [] };
    this.saveDatabase();
  }

  // Veri ekleme
  insertData(tableName, rowData) {
    this.data[tableName].rows.push(rowData);
    this.saveDatabase();
  }

  // Veri güncelleme
  updateData(tableName, rowIndex, updatedData) {
    this.data[tableName].rows[rowIndex] = updatedData;
    this.saveDatabase();
  }

  // Veri kaldırma
  deleteData(tableName, rowIndex) {
    this.data[tableName].rows.splice(rowIndex, 1);
    this.saveDatabase();
  }

  // Veri seçme
  selectData(tableName) {
    return this.data[tableName].rows;
  }
}

// Örnek kullanım
const myDatabase = new SimpleDatabase('myDatabase');

myDatabase.createTable('users', ['id', 'name', 'age']);
myDatabase.insertData('users', { id: 1, name: 'John Doe', age: 25 });
myDatabase.insertData('users', { id: 2, name: 'Jane Doe', age: 30 });

console.log('Before Update:');
console.log(myDatabase.selectData('users'));

myDatabase.updateData('users', 0, { id: 1, name: 'Updated John Doe', age: 26 });

console.log('\nAfter Update:');
console.log(myDatabase.selectData('users'));

myDatabase.deleteData('users', 1);

console.log('\nAfter Delete:');
console.log(myDatabase.selectData('users'));

// Veritabanını kaldırma
// myDatabase.dropDatabase();

Bu yöntemin MySQL kadar performansının yüksek olmayacağını düşünüyorum. Bunun için veritabanını klasöre çevirme ve klasör içinde tablo dosyaları yerleştirmeyi düşündüm ama yine de size de bir sorayım diyorum. Örneğin tek tablo dosyasında 1.000 veya 10.000 tane veri olduğunda performans ne ölçüde etkilenir? Daha iyi bir yöntem bulunuyor mu? Sistemi kendim kodlamak istiyorum, farklı bir yazılım tavsiye etmeyin. NodeJS tabanlı bir kütüphane olursa önerebilirsiniz.
bunu db yazmakla pek alakasi yok
 
Var aslinda, basit file sistem DB'si yapmis oluyor.
Hatta muhtemelen MySQL'den de daha performansli calisir :)
Yüksek performans vereceği bakımından haklısınız. Çünkü MySQL motoru basit bir veritabanı dahi olsa veriyi gecikmeli çekiyor. Örneğin oyun sunucusunda MySQL üzerinden veri çekiyorum o sırada gecikme oluyor. Bu da oyuncuları etkiliyor. Dosya sisteminden bir veri çektiğimde anında çekiyor. Bu mantıkla daha iyi performans sunacağı kesin.

Lakin şöyle bir sıkıntı var. Eğer dosya tabanlı bir veritabanı sistemi kullanırsak bu sefer MySQL motorunda yer alan bazı SQL sorgusu özellikleri yer almayacak. Fonksiyonları okuma, yazma ve sayma gibi şeyler olacak. Biliyorsun ki SQL komutları arasında pek çok komut var.

Bu komutların bazılarını kullandığım için bu dönüştürmenin uygun olmayacağı kararına vardım ve Windows makineye geçip aynı sistemi devam ettirdim.
 
Yüksek performans vereceği bakımından haklısınız. Çünkü MySQL motoru basit bir veritabanı dahi olsa veriyi gecikmeli çekiyor. Örneğin oyun sunucusunda MySQL üzerinden veri çekiyorum o sırada gecikme oluyor. Bu da oyuncuları etkiliyor. Dosya sisteminden bir veri çektiğimde anında çekiyor. Bu mantıkla daha iyi performans sunacağı kesin.

Lakin şöyle bir sıkıntı var. Eğer dosya tabanlı bir veritabanı sistemi kullanırsak bu sefer MySQL motorunda yer alan bazı SQL sorgusu özellikleri yer almayacak. Fonksiyonları okuma, yazma ve sayma gibi şeyler olacak. Biliyorsun ki SQL komutları arasında pek çok komut var.

Bu komutların bazılarını kullandığım için bu dönüştürmenin uygun olmayacağı kararına vardım ve Windows makineye geçip aynı sistemi devam ettirdim.

MySQL de dosya sistemi kullaniyor. Gecikmenin sebebi ACID. Sen yazip geciyorsun, herhangi bir integrity kontrolu yok, transaction support yok, type kontrolu yok, user-grant kontrolu yok, rate-limiting kontrolu yok.
 

Geri
Yukarı