Veritabanlarında birincil anahtarlar ve float veri tipi

Veritabanlarında tablolar oluştururken birincil anahtar belirleme gereği duyarız. Bu pek çok defa işimize yarayacak, hataları azaltacak ve veriye olan erişimimizi hızlandıracaktır.

Birincil anahtar tanımlarken, veritabanı size artışsal tekil anahtarlar(incremental unique key) tanımlayabilme, böylece kod içerisinde anahtarlarla hiç uğraşmama şansı tanıyor. Bu yaklaşım işi oldukça kolaylaştırsa da; ileride yapılacak olan veritabanı yedeklemesi, veritabanının veya belli tabloların kurtarılmaya çalışılması, verilerin taşınması gibi işlemleri büyük ölçüde zorlaştırıyor.

Bu nedenle artışsal birincil anahtar tanımlarını sadece olaylar, tarihçe veya değişmez verileri içeren, çok da önemli olmayan tablolarda kullanmaya çalışıyorum. Yüksek öneme sahip tablolarımda ise, gelen verilerden bir veya birkaçını referans kabul ederek, gerekiyorsa bunlrı birleştirip, örneğin hex değerlerini alıp kendim bir tekil anahtar oluşturma yoluna gidiyorum. Böylece aynı anahtarı, tablomdaki veri tamamen silinse bile yeniden oluşturabiliyorum ve diğer tablolarla veri bütünlüğünü kaybetmemiş oluyorum. Veri yedekleme, taşıma ve kurtarma sırasında da çok işime yarıyor.

Yine bir projede bu mantıkla hareket edip, kendi tekil anahtarlarımı yaratmaya başladım, ama oluşan anahtarlar, referans aldığım verilerin uzun olması nedeniyle 15 hanelik sayılar olarak ortaya çıktı. Daha önce hiç float birincil anahtar denememiştim, bir deneyelim bakalım dedim ve float olarak tanımlarımı yaptım.

Proje bitti, iki ay kullanıldı. Sonra bir gün bilgiler yarım geliyor dediler. Kodu açtık ve hatayı bulduk: tekil anahtarlar artışsal bir referansa da bağlı olduklarından, veri artışı olunca 15 hane olarak öngördüğüm anahtar uzunluğu 16 haneye çıkmış, float veri tipi 15 haneden sonrasında bilimsel gösterim (scientific notation) e geçtiği ve "E+" şeklinde bir gösterim uyguladığı için benim sorgular çalışmaz hale gelmişti. Kod içerinde yaptığım "toString", veri tipi dönüştürme (casting) gibi işlemler de sorunu çözemedi. İşin acil bitmesi gereklili ile en son bulduğum çözüm yolu veri tipini "decimal" olarak değiştirmek oldu. Neyseki proje çok büyük değildi bir kaç saatte bitirdim.

Hiç yorum yok: