Bilmek istediğin her şeye ulaş

İngilizce sözlük yazılımı yapıyorum. Veritabanı olarak SQL Server kullanıyorum. En hızlı çalışacak tablo yapısı sizce nasıl olmalıdır?

Tablodan veri çekme işlemini performanslı hale getirmek için cevap verecek olursam, index'leme konusunu inceleyebilirsiniz. Tablo üzerinde çalıştıracağınız SELECT cümlelerinde hangi alanlar üzerinde koşul (WHERE) yazdığınızı analiz ederek bir strateji geliştirebilir ve hangi alanları indexlemenin uygun olduğunu bulabilirsiniz.
Örneğin;

Code
SELECT * FROM Dictionary 
WHERE Field1 = @param1


Diyelim ki Field1 isimli alan üzerinden sıklıkla sorgu yapıyorsunuz. Öyleyse ilgili alanı index'leyerek sorgu sonuçlarının daha kısa sürede getirilmesini sağlayabilirsiniz.

Birkaç türde daha Index'leme mevcut. Bunlardan bir diğeri de filtered index.
Diyelim ki tablonuzda Status isimli bir alan var ve kayıtların durumlarını tutuyor. Elinizde de Active anlamına gelen 1 değerinde bir Status bilginiz var ve tablo üzerinde gerçekleşen sorguların çoğunluğu bu Status değerine uyan kayıtları getirmek üzerine.
Örneğin;

Code
SELECT * FROM Dictionary
WHERE Status = 1 AND Field1 = @param1

Eğer Status alanı üzerinde bir filtered index oluşturursanız ve index'e koşul olarak 1 değerini verirseniz yukarıdaki sorguyu çalıştırdığınızda SQL Server bütün tabloyu değil yalnızca index'leme sonucu oluşan veri kümesinde yer alan alanı tarar.

Kısacası, veri çekme işlemi için öncelikle indexleme konusunu araştırabilir / uygulayabilirsiniz.

Veri kaydetme (INSERT) işlemlerini hızlandırmak içinse önerebileceğim yollardan biri tablodaki Id alanının tipi ve default value tanımı üzerine olacaktır. Eğer tablodaki Id alanının tipini integer yaparsanız INSERT işlemleri daha performanslı olacaktır. Fakat Id alanını uniqueidentifier tipinde tanımlamanız gerekliyse, yeni bir uniqueidentifier verisinin oluşturulması için geçen zamanı kısaltmak için Id alanının default value değerini NEWSEQUENTIALID() olarak tanımlarsanız NEWID()'den daha hızlı sonuç alırsınız.
msdn.microsoft.com/en-us/library/ms1897... .
  • Paylaş
Brutal Code (@brutalcode) 'un bahsettiği gibi; WHERE koşullarında ve JOIN'lerde kullanılan alanları Index'lemek, veritabanı sorgularında performans açısından önemlidir. Ek olarak, metin (string) alanlar üzerinde sorgulamalar için SQL Server'daki FULLTEXT INDEX özelliğini de incelemenizi öneririm.
  • Paylaş
Bence yapı anladığım kadarı ile şöyle olmalı:
Languages Tablosu (Id, Language)
ID: 1 - Türkçe, ID: 2 İngilizce, ID: 3 - Fransızca... Gibi

Words tablosu (Id, LanguageId, Text)
ID: 1 - LanguageId: 2 - hello || ID: 2 - LanguageId: 1 - merhaba

Translations tablosu (Id, WordId, TargetWordId, Description)
ID: 1 - WordId: 2, TargetWordId: 2, Description: "Selamlaşmada kullanılır... Örnek kullanım... Vs"

Yeni bir dil eklemek istediğinde; Languages tablosuna bir satır girersin ve o satırın ID bilgisi ile Words ve Translations tablolarına girişler yaparsın.

Words tablosu, bir dildeki kelimeleri tuttuğun tablodur.

Translations ise, farklı dillerdeki kelimelerin eşleştirilmesini sağlayan tablodur. Bu tabloya bir sorgu yaparken öncelikle aranacak olan kelimenin WordId bilgisi için Words tablosuna başvurmalısın. Ardından bu bilgi ile bu tabloda istenen tüm çevirileri elde etmen mümkündür.

Yani benim anladığım bu şekilde ama işini tam görür mü bilemedim...
  • Paylaş
Sözlükte neler olacağını bilmeden o konuda kesin birşey söyleyemem ama aramanın hızlı çalışması için nasıl olması gerektiğini söyleyebilirim. Aranabilecek her alanı ayrı bir tabloya latin1 olarak koyman gerek:
tablo_adi
tablodaki_id
alan_adi
alan_degeri
Bu tabloyu alan değerleri sütununda endekslersen optimum hızda sonuç elde edebileceğin bir yapı oluşturabilirsin.
  • Paylaş
Sonraki Soru
HESAP OLUŞTUR

İstatistikler

119 Görüntülenme7 Takipçi4 Yanıt