Daha iyi bir SQL şeması için 10 kural

Bir database içinde tablo, alan adları, prosedürler, fonksyionlar oluştururken dikkat edilmesi gerektiğini düşündüğüm 10 temel kuralı bu yazıda bulabilirsiniz.

Yeni tablolar ve data yapıları yaratıldığında design patternlerden ve db admin ototiriteleri tarafından belirlenen çok fazla tanımlama vardır. Bunlardan bazıları başlangıçta ya da database yaşam döngüsü sürecinde önemsiz görünebilir.

Aşağıdaki kurallara uymak büyük enerji ve zaman kazancı sağladı bana. Bir sonraki sıfır projelerimde de kullanılmak üzere bir yerlerde kayıtlı olsun istedim ve burada tembellik yapmadan yazıyorum. Sizin için de umarım yararlı olur.

1- Sadece küçük harf, rakam ve alt çizgi kullanın

Database, schema, tablo ve column adlarında nokta, boşluk veya tire kullanmayın. Nokta objeleri tanımlamak iin kullanılır: database.schema.table.column.

İsimlerdeki noktalar objeler ile karışıklığa neden olacaktır. Aynı şekilde boşluk kullanmanın ne gibi sakıncalarının olacağını aşağıdaki cümlelere bakıp görebiliriz.

select "user name" from events

— vs

select user_name from events

Obje adlarında büyük harf kullanmak query yazımını zorlaştırır. Eğer herşey küçük harf ise, tablo ya da column adında büyük mü küçük mü harf kullandığınızı hatırlamaya çalışmazsınız. Çünkü hepsi küçük!

2- Basit, tanımlayıcı column adları kullanın

Eğer users tablosunda packages tablosunun foreign keyi varsa, bunun adını package_id verin. Kısalatmak isteyipte pcg_fk gibi bir şey yazarsanız, başkaları “bu alan da ne ya!” diyebilir. Basit, başkaları tarafından da rahatça anlaşılır isimler verin. Ki hangi tabloya hangi alanla gidildiği anlaşılsın.

item_type veya item_value gibi isimler kullanmayın. Yoksa her select querysinde “as” kullanmak zorunda kalırsınız. Aşağıdaki satırları yazacak kadar kaba değilsinizdir biliyorum fakat yeni başlayanların görmeleri iyi olacak.

select sum(item_value) as photo_count
from items
where item_type = 'Photo Count'

— vs

select sum(photo_count) from items

Column adlarına tablonun adını dahil etmeyin. Her column adından önce bir şekilde tablo adını gireceğinizden, bu isimlendirme size hiç bir yarar sağlamayacaktır. Örnek: photo_name, photo_src

Ayrılmış anahtar sözcükleri kullanmaktan kaçının. Bunlar column, tag, user vs.. Bu şekilde alanı çağırdığınızda ekstra performans harcamak zorunda kalabilirsiniz.

3- Basit, tanımlayıcı tablo isimleri girin

Eğer tablo adınız iki kelimeden oluşuyorsa alt tire kullanarak bunları ayırın. user_roles adı userroles adından tabiki daha okunaklıdır. Eğer mümkünse sadece tek kelime kullanın. roles adı tamamından daha okunaklı ve sadedir.

4- Tablonuzda primary key olsun

Tablonuzda standart bir id alanı primary key olarak olsun. Auto-increment seçeneğini Yes olarak işaretlemeyi unutmayın. Tekrar etmesi durumunda başınıza büyük bela alabilirsiniz. Önemli ve büyük bir tabloda güncelleme ve silme işlemlerinde de bu alan kolaylık sağlayacaktır.

5- Foreign keyleri ilgili tablolar ile tutarlı isimlendirin

Primary ve foreign keylerle ilgili çok fazla isimlendirme yöntemi vardır. Benim önerim ve çokça tutulan yöntem olan, primary keyi id olan foo adındaki tablomuzun alanını başka tabloda foo_id olarak kullanmak.

Diğer bir popüler yöntem ise hem asıl tabloda hem de diğerlerinde aynı alan adını kullanmak: foo_id. Ancak bu ilerleyen projelerinizde karışıklığa neden olabilir.

fid gibi kısaltmalarla foreign key isimlendirmemeyi önceki maddelerden de hatırlıyoruz.

select *
from packages
join users on users.user_id = packages.uid

— vs

select *
from packages
join users on users.id = packages.user_id

— veya

select *
from packages
join users using (user_id)

Başka bir tablo ile alan adını birleştireceğiniz için ilgili alan adında tablo adını vermeyi unutmayın. Örneğin user_id yerine owner_id kullanmayın.

6- Datetime alanlarını Datetime tipinde kullanın

Unix timestamps ya da string tipinde datetime alanları kullanmayın. Convert işlemleri sırasında istemediğiniz sıkıntılar yaşayacağınızı garanti ediyorum.

Yıl, ay, gün hatta saat için ayrı alanlar oluşturmayın. Tamamını tek bir alanda Datetime olarak kaydedin. En az sorgu ile istediğiniz veriyi almanız önemli.

7- UTC, varsa yoksa UTC!

Zaman dilimi (timezone) seçiminde UTC seçimi problemsiz timezone değerleri sunmanızı sağlayacaktır.

Yani database timezone’u UTC olsun, ve böylece tüm datetime columnlarındaki değerler bu veriye göre işlensin. Bunu yapmazsanız tüm zamanlarınız daha zor analiz edilecek, kodlamanız zorlaşacaktır.

8- Sadece kullandığınız alanlar kalsın

Bir veri parçası için sadece bir doğru kaynak vardır. Kullanmadığınız alanları fakrlı isimlerle tablo içinde bulundurmayın. Gerçek veri bir tanedir ve sadece o kalsın. user_id_backup, user_id_old, user_id2 gibi karmaşa yaratacak alanlar olmasın. Bir select ile tabloda veri çekeceğinizi düşünün hiç bir şekilde kullanmadığınız bu alanlar için de bir efor harcanacak.

select * from users

9- Tablo column sayısını uzatmayın

Süper geniş alanlı tablolar kullanmayın. Eğer bir anket tablonuz için question, answer1, answer2, answer3 adında alanlarınız varsa bu işi yanlış yapıyorsunuz. Bunun yerine üç tablo kullanın: survey_question, survey_answer ve survey_user_answer

survey_question için alanlar:

id int,
question nvarchar(250),
createdate datetime

survey_answer için ise:

id int,
name nvarchar(250),
survey_question_id int

survey_user_answer için ise:

id int,
survey_question_id int,
survey_answer_id int

şeklinde olabilir. id alanları için primary key ve auto-increment seçilmiş olsun. survey_user_answer içindeki survey_question_id ve survey_answer_id değerleri sırasıyla survey_question ve survey_answer tablosuna bağlıdır.

10- Her veri için tablo yapmayın

Datetime değerleri, ülke, şehir, posta kodları gibi veriler için ayrı tablo oluşturmayın. Join işlemlerinin çok olduğu sorguların databaseinizi yoracağını ve işlem süresinin uzayacağını unutmayın.

Umarım bundan sonraki database ve tablolarınız çok daha kolay ve kodlanabilir olacaktır. Eğer aynı fikirde değilseniz lütfen yorum olarak katkılarınızı sunun.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir