﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ibonette.com &#187; veritabanı</title>
	<atom:link href="http://www.ibonette.com/tag/veritabani/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ibonette.com</link>
	<description>Samimi olmayi vaat edebilirim ama tarafsiz olmayi asla...</description>
	<lastBuildDate>Thu, 09 Sep 2010 14:12:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Veritabanı Tasarımı-2: Resmi Olmayan (Pratik) Yaklaşım</title>
		<link>http://www.ibonette.com/veritabani-tasarimi-2-resmi-olmayan-pratik-yaklasim/</link>
		<comments>http://www.ibonette.com/veritabani-tasarimi-2-resmi-olmayan-pratik-yaklasim/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 09:29:37 +0000</pubDate>
		<dc:creator>ibrahim</dc:creator>
				<category><![CDATA[PROGRAMLAMA]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php proje geliştirme]]></category>
		<category><![CDATA[veritabanı]]></category>
		<category><![CDATA[veritabanı tasarımı]]></category>
		<category><![CDATA[web uygulama geliştirme]]></category>

		<guid isPermaLink="false">http://www.ibonette.com/?p=362</guid>
		<description><![CDATA[Bir önceki yazımda, veritabanı tasarımının neden çok önemli olduğunu, kötü tasarlanan veritabanının nelere yol açabileceğini kısaca özetlemeye çalışmıştım. Okumadıysanız önceki yazımı kısaca bir gözden geçirmenizi tavsiye ederim. Bu yazımda ise iyi bir veritabanı tasarımının pratiik olarak nasıl yapılacağı üzerinde duracağım.

Resmi Olmayan (Pratik) Yaklaşım, genellikle oldukça kullanışlı bir veritabanı tasarımı üretir. Bu, çoğu veritabanı tasarımcısının kullandığı yöntemdir. Bir sonraki yazımda anlatmaya çalışacağım "resmi yaklaşım", sıfırdan veritabanı oluşturmaktan çok, "resmi olmayan" yaklaşımla oluşturulan veritabanı tasarımının sınanması ve doğrulanması için kullanılır.

Lafı fazla uzatmadan anlatıma geçiyorum.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ibonette.com/veritabani-tasarimi-1-veritabaninin-uygulamadaki-yeri-ve-veritabani-tasarimina-giris/" target="_blank">Bir önceki yazımda</a>, veritabanı tasarımının neden çok önemli olduğunu, kötü tasarlanan veritabanının nelere yol açabileceğini kısaca özetlemeye çalışmıştım. Okumadıysanız önceki yazımı kısaca bir gözden geçirmenizi tavsiye ederim. Bu yazımda ise iyi bir veritabanı tasarımının pratiik olarak nasıl yapılacağı üzerinde duracağım.</p>
<p>Resmi Olmayan (Pratik) Yaklaşım, genellikle oldukça kullanışlı bir veritabanı tasarımı üretir. Bu, çoğu veritabanı tasarımcısının kullandığı yöntemdir. Bir sonraki yazımda anlatmaya çalışacağım &#8220;resmi yaklaşım&#8221;, sıfırdan veritabanı oluşturmaktan çok, &#8220;resmi olmayan&#8221; yaklaşımla oluşturulan veritabanı tasarımının sınanması ve doğrulanması için kullanılır.</p>
<p>Lafı fazla uzatmadan anlatıma geçiyorum.</p>
<p><span style="text-decoration: underline;"><strong>Ana Varlıkların Belirlenmesi</strong></span></p>
<p>Her uygulama bir takım varlıklar içerir. Bu varlıkların özellikleri ve birbiriyle ilişkileri uygulamanın temelini oluşturur.  Bu aşamada sadece uygulamanın üst düzey nesneleri ile ilgilenmek gerekir. İleriye dönük bazı fikirlerinizin olması mantıklı olsada, bu aşamada, her varlığın özniteliklerini düşünmek için fazla ısrarcı ve aceleci olmayın.</p>
<p>Örnekler;<br />
<em>Ders planlama sistemi: </em>öğretmenler, öğrenciler ve dersler&#8230;<br />
<em>Havayolları bilet sistemi:</em> müşteriler, uçuş personeli, seferler, uçaklar, koltuklar, havalimanları, kapılar&#8230;<br />
<em>Futbol ligi:</em> oyuncular, takımlar, sahalar, oyunlar, çalıştırıcılar, hakemler&#8230;<br />
<em>Sipariş sistemi: </em>müteriler, tedarikçiler, müşteri siparişleri, satın alım siparişleri, ürünler, müşteri faturaları, depolar&#8230;</p>
<p><span style="text-decoration: underline;"><strong>Her Ana Varlık İçin Bir Tablo Oluşturulması</strong></span></p>
<p>Bir önceki aşamada belirlenen her ana varlık için bir tablo oluşturulur. Her tabloya, açıklayıcı ama kısa ve kolay yazılıp hatırlanan bir isim verin.</p>
<p>Örnek;<br />
Satılan ürünlerin tanındığı tabloya &#8220;urun&#8221; adı verilebilir.</p>
<p><span style="text-decoration: underline;"><strong>Her Ana Varlık İçin Bir Anahtar Seçilmesi</strong></span></p>
<p>Ana varlıkları benzersiz bir biçimde tanımlayacak bir alan belirleyin. Bu, tablonun birincil anahtarıdır (primary key). Birincil anahtar boş olamaz ve tablodaki her kaydın farklı bir birincil anahtarı olmalıdır. Yani birincil anahtara göre kayıt sorgulaması yapıldığında sadece bir kayıt döndürmelidir.</p>
<p>Birincil anahtar olarak ne kullandığınız bilgisayar açısından farketmese de, varlığın doğasında bulunan ve benzersiz, tekrarsız bir özellikle tanımlamanız daha doğru olur. Yani örneğin &#8220;kitap&#8221; tablosunda, sizin belirleyeceğiniz uydurma bir alanı birincil anahtar olarak belirlemek yerine,  (eğer mümkünse) her kitabı kendilinden ve doğal olarak tanımlayan ve benzersiz olan &#8220;ISBN&#8221; &#8216;i (uluslararası standart kitap numarası) birincil olarak tanımlamak daha uygun olur.</p>
<p>Diğer taraftan kimi doğal anahtarlar, yukarıdaki kitap örneğinde olduğu gibi, birincil anahtar olarak kullanmaya pek uygun olmayabilir. Çok uzun, büyük-küçük harf duyarlı, türkçe karakterler içeren, boşluk ve noktalama içeren anahtarlar genellikle kötü veritabanı anahtarı olarak algılanır. Bu tür durumlarda, 1,2,3 gibi ya da otomatik artan bir alanı birincil anahtar olarak belirlemek daha mantıklı olur.</p>
<p><span style="text-decoration: underline;"><strong>Her Ana Varlık Tablosuna, Varlık Özniteliklerinin Eklenmesi</strong></span></p>
<p>Uygulamanızda tanımladığınız ana varlıkların (tabloların)özniteliklerinin belirlenmesidir. Örneğin &#8220;musteri&#8221; tablosunda, ad, adres, sehir, ulke, telefon, faks vb özellikler tabloda bir alan (saha ya da sutun da denir) olarak tanımlanır.</p>
<p>Bu aşamada, basılı formlar, dokümanlar, uygulamayı kullanacak olanların görüşleri vs bu konuda önemli ipuçları verir. Ancak her uygulamada farklılık göstereceğini unutmamak lazımdır. Yani bir uygulamada &#8220;musteri&#8221; tablosu, farklı özniteliklerden (alanlardan) oluşmakta iken, başka bir uygulamada daha farklı özniteliklerden oluşabilir.</p>
<p><span style="text-decoration: underline;"><strong>Tekrarlanan Öznitelikler için Ek Tablolar Oluşturulması</strong></span></p>
<p>Tablo özniteliklerini belirlerken, bazı alanların tekrarlanan veriler içerebildiğini göreceksiniz.<br />
Örneğin; &#8220;kitap&#8221; tablosunu tanımlarken, &#8220;yazar&#8221; özniteliğinin (alanının) içeriğinin, bazı kayıtlarda (satırlarda) tekrarlanan bir yapıda olabileceğini görürsünüz. Bu durumda, &#8220;kitap&#8221; tablosundaki tekrarlanan &#8220;yazar&#8221; alanını, &#8220;kitap&#8221; tablosunun dışına alarak &#8220;yazar&#8221; adında ayrı bir tablo tanımlamanız gerekir.</p>
<p><span style="text-decoration: underline;"><strong>Her Alanın (özniteliğin), Birincil Anahtarın Özniteliği Olduğundan Emin Olun</strong></span></p>
<p>Birincil anahtarıni tablodaki her alan için mantıklı bir arama sağladığından emin olunması gerekir.</p>
<p>Örneğin;<br />
uye_kodu (birincil anahtar)<br />
uye_adi<br />
uye_adresi<br />
uye_grup_kodu<br />
uye_grup_adi<br />
şeklindeki bir &#8220;uye&#8221; tablosunda, tabloya ait olmayan alan, &#8220;uye_grup_adi&#8221; alandır. Bu alan &#8220;uye_grup&#8221; tablosunun bir alanıdır. Bir başka deyişle &#8220;uye_grup_adi&#8221; &#8216;nı bulmak, &#8220;uye_kodu&#8221; alanını sağlamayı gerektirmez. &#8220;uye_grup_adi&#8221; &#8216;nı bulmak için &#8220;uye_grup_kodu&#8221; alanını sağlamak gerekir ve dolayısı ile &#8220;uye_grup_adi&#8221; alanı, &#8220;uye_grup&#8221; tablosuna aittir. &#8220;uye_grup&#8221; tablosunun birincil anahtarı, &#8220;uye_grup_kodu&#8221; dur.</p>
<p>Peki belirli bir üye için üye grubu adını nasıl belirleriz? Bu durumda, &#8220;uye&#8221; tablosundaki &#8220;uye_grup_kodu&#8221; alanına bağlı olarak, &#8220;uye_grup&#8221; tablosuna bağlanarak üye kodu bilinen kaydın &#8220;uye_grup_adi&#8221; &#8216;nı alırız.</p>
<p><span style="text-decoration: underline;"><strong>Tablolar Arasındaki İlişkilerin Gözden Geçirilmesi</strong></span></p>
<p>Her bir varlığa karşılık gelecek ayrı bir tablo oluşturduk. Şimdi ise tıpkı gerçek hayatta olduğu gibi, veritabanında  da, varlıkların (yani tabloların) birbiri ile olan ilişkileri belirlenmelidir.<br />
Bu işlem kısaca, birbiri arasında ilişki olan tabloların, ilişki tanımlaması amacıyla, ortak alanlarının belirlenmesi anlamına gelir.</p>
<p>Bir önceki adımdaki örnekte, &#8220;uye&#8221; tablosu ile &#8220;uye_grup&#8221; tablosu arasındaki ilişki, ortak alan olarak kullanılan &#8220;uye_grup_kodu&#8221; alanı ile sağlanır.</p>
<p>İki farklı tablodaki (ilişki kurmakta kullanılacak ortak) iki alan, aynı anlama sahipse, ikisine de aynı adı vermek tavsiye edilir. Yani grup kodu ile iki tablo arasında ilişki belirlerken, &#8220;grup_kodu&#8221; tablosunda &#8220;uye_grup_kodu&#8221; adını kullanırken, &#8220;uye&#8221; tablosunda &#8220;kullanıcı_grup_kodu&#8221; adını kullanmak, veritabanının çalışmasını engellemez ancak kullanımı güçleştirerek karmaşaya neden olur.</p>
<p>Çok genel olarak yukarıdaki şekilde özetlenbilecek &#8220;resmi olmayan (pratik) yaklaşımı&#8221; kullanarak, düzgün tasarlanmış bir veritabanı tasarımına ulaşabilirsiniz. Ancak belirmem gerekir ki, burada maddeler halinde kısaca belirttiğim husuları biraz daha ayrıntılı olarak incelemek ve iyice sindirmek gerekir. Çünkü bu adımlar, uygulanmaya kalkıldığında, her adımda belirtilen husuların sağlandığını sanıp gözünüzden kaçan noktalar olduğunun farkına varamayabilirsiniz. Örneğin &#8220;Tekrarlanan Öznitelikler için Ek Tablolar Oluşturulması&#8221; adımını, veritabanındaki tüm tablolara eksiksiz olarak uyguladığınızı düşünebilirsiniz ancak gözünüzden kaçanlar olabilir. Özellikle bir sürü tablodan oluşan büyükçe uygulamaların veritabanlarını tasarlarken her bir adım uzun uzun ve dikkatle veritabanı üzerinde çalışmayı gerektirir.</p>
<p>Konuya uzak olan kişilere, yukarıdaki bazı anlatımlar kafa karıştırıcı gelebilir. Ancak aslında öyle olmadığını unutmayın. Karmaşık gelen anlatımları, kavrayabilmek için kendinize zaman verin, araştırın, sorun&#8230; Kısa süre içinde kafanızda canlanacak ve tam olarak ne anlama geldiğini anlayacaksınız. Önemli olan adımların ne anlama geldiğini kavramaktan ziyade, fiili olarak veritabanı üzerinde çalışırken bu adımları tam olarak gerçekleştirebilecek konsantrasonu gösterebilmektir.</p>
<p>Bir sonraki yazımda &#8220;resmi yaklaşım&#8221; dan bahsedeceğim. Bu konu, yukarıda anlattıklarımdan çok farklı şeyler olmayıp, yukarıdaki adımlarla pratik bir şekilde üretilen veritabanı tasarımınızın sağlamasını yapmanızı sağlayan bir araç olarak kullanacaksınız.</p>
<p>Sevgilerimle</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ibonette.com/veritabani-tasarimi-2-resmi-olmayan-pratik-yaklasim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Veritabanı Tasarımı-1: Veritabanının Uygulamadaki Yeri ve Veritabanı Tasarımına Giriş</title>
		<link>http://www.ibonette.com/veritabani-tasarimi-1-veritabaninin-uygulamadaki-yeri-ve-veritabani-tasarimina-giris/</link>
		<comments>http://www.ibonette.com/veritabani-tasarimi-1-veritabaninin-uygulamadaki-yeri-ve-veritabani-tasarimina-giris/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 06:31:55 +0000</pubDate>
		<dc:creator>ibrahim</dc:creator>
				<category><![CDATA[PROGRAMLAMA]]></category>
		<category><![CDATA[TEKNOLOJİ]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php proje geliştirme]]></category>
		<category><![CDATA[veritabanı]]></category>
		<category><![CDATA[veritabanı tasarımı]]></category>
		<category><![CDATA[web uygulama geliştirme]]></category>

		<guid isPermaLink="false">http://www.ibonette.com/?p=358</guid>
		<description><![CDATA[Pratikte, üzerinde çalıştığımız uygulamalarımızın çok büyük çoğunluğu, veritabanı ve bu veritabanı üzerinde çalışan kodlardan oluşurlar.

Programlamaya yeni başlayan amatör programcılar, uygulama geliştirirken  genellikle kodlar (php vs.) üzerinde dururlar. Oysa ki kod kısmı işin en son kısmı olup, öncesinde  yapılan bir takım analiz ve hazırlıklar sonucunda üretilen uygulama gereklerini, gerçekleştirmek üzere yazılır ve hangi programlama dilini kullanırsanız kullanın çok fazla farklılık göstermezler. Programlama dili değiştiğinde temel olarak değişen, yazım kurallarıdır. Yine aynı döngüleri, aynı mantıksal sınamaları, aynı karşılaştırmaları yaparsınız. Sadece yazım şekli değişir ancak temelde hangi dili kullanırsanız kullanın kodunuz aynı işleri yapar ve aynı sonuçları üretir. Tabi ki istisnaları da olmakla birlikte genel olarak durum böyledir.]]></description>
			<content:encoded><![CDATA[<p>Pratikte, üzerinde çalıştığımız uygulamalarımızın çok büyük çoğunluğu, veritabanı ve bu veritabanı üzerinde çalışan kodlardan oluşurlar.</p>
<p>Programlamaya yeni başlayan amatör programcılar, uygulama geliştirirken  genellikle kodlar (php vs.) üzerinde dururlar. Oysa ki kod kısmı işin en son kısmı olup, öncesinde  yapılan bir takım analiz ve hazırlıklar sonucunda üretilen uygulama gereklerini, gerçekleştirmek üzere yazılır ve hangi programlama dilini kullanırsanız kullanın çok fazla farklılık göstermezler. Programlama dili değiştiğinde temel olarak değişen, yazım kurallarıdır. Yine aynı döngüleri, aynı mantıksal sınamaları, aynı karşılaştırmaları yaparsınız. Sadece yazım şekli değişir ancak temelde hangi dili kullanırsanız kullanın kodunuz aynı işleri yapar ve aynı sonuçları üretir. Tabi ki istisnaları da olmakla birlikte genel olarak durum böyledir.</p>
<p>Kodlama ve programlama dili konusunu çok basite indirgemek için değil, kodlamaya başlamadan önceki analiz ve planlamalara özel bir vurgulama yapmak için yazdım bunları. Yoksa tabi ki programlama dili çok önemlidir. Fakat yine de programlama dili seçimi, öncesindeki analiz çalışmalarının sonucunda yapılmalıdır.</p>
<p>Uygulama geliştirmenin ilk ve en önemli aşaması olan analiz ve planlama &#8216;nın pratikte üç önemli ayağı vardır;<br />
* Durum tespiti ve ihtiyaç belirleme (iş analizi),<br />
* Veritabanı tasarımı,<br />
* Algoritma geliştirme,</p>
<p>Bunların herbiri, üzerinde uzun uzun ve ayrıntılı olarak çalışılması gereken ve her programcı (ya da proje yöneticisi) tarafından iyice öğrenilip uygulanılıyor olması gereken çok önemli konulardır. Bu konulardan teorik olarak bahseden ve bir takım yöntem ve kuralları vurgulayan bir sürü yazılı kaynak olmasına rağmen, asıl beceri ve bilgi, programcının zaman içinde edindiği tecrübeleri sayesinde oluşur. Yani uygulama geliştirdikçe ve özellikle kaliteli bir proje ekibi içinde  mesai yaptıkça, programcı, pratik olarak bu becerileri kazanır. Programcılık işinin literatürden ziyade usta çırak ilişkisi ile öğrenilen taraflarından birisi de budur.</p>
<p>Üzerinde düşünmeden hazırlanan bir veritabanı üzerinde çalışmak (sorgulama vb), zaman geçtikçe çok zorlaşabilmektedir. Örnek vermek gerekirse; gelecekte programcıdan istenen basit bir rapor, sırf veritabanı düzgün tasarlanmadığı için imkansız ya da çok zorlayıcı bir iş haline gelebilir. Bunun yanında, düzgün tasarlanmayan veritabanı, uygulamanın genişletilebilir olmasını büyük ölçüde baltalar. Örneğin ileride programcıdan istenen bir ek modül, yine sadece veritabanı düzgün tasarlanmadığı için imkansız ya da çok zorlayıcı bir iş haline gelebilir. Hepsinden önemlisi düzgün tasarlanmayan veritabanı, veri tutarsızlığı, tekrarlanan veriler gibi bir sürü çarpıklıktan oluşan bir çorbaya döner. Böyle bir veritabanı, zaman içinde, yukarıda bahsettiğim sorunların birbirini tetiklediği ve büyüttüğü bir kabus haline gelir. Programcı kendini, bitip tükenmek bilmeyen bir sürü anlamsız sorunlardan oluşan kısır bir döngü içinde bulur kendini.</p>
<p>İşte bu nedenle, uygulamayı kodlamaya başlamadan önce, üzerinde çalışacağınız veritabanını çok iyi tasarladığınızdan emin olmalısınız.</p>
<p>Bu yazımda ve devam eden birkaç yazımda, en önemli ayaklardan birisi olan &#8220;veritabanı tasarımı&#8221; konusunu ele almaya çalışacağım. Bunu yaparken teorik ve genel kabul görmüş kuralların yanında, pratik ve konununun özüne yönelik kısımlarından da bahsedeceğim.</p>
<p>Veritabanı tasarımı konusunda temelde iki yaklaşım mevcuttur;</p>
<p><span style="text-decoration: underline;"><strong>Resmi Yaklaşım; </strong></span></p>
<p>İlişkisel veritabanı oluşturulması/tasarlanması sürecinde, bir takım normalleştirme kurallarını(derecelerini) ifade eder. İlk olarak E.F.Codd tarafından kullanılan bu yaklaşım günümüzde çok geniş bir sorun yelpazesine uygulanabilir bir veritabanı modelini ortaya çıkarmıştır. Uzmanlar tarafından bir çok normalleştirme derecesinden bahsedilsede ilk beşi genel kabul görmüş ve resmileşmiştir. Ancak şahsen belirtmek isterim ki &#8220;resmi yaklaşım&#8221; olarak bahsedilen bu yöntem pratikte veritabanı tasarımı yaparken kullanmaktan ziyade, aşağıda bahsettiğim &#8220;resmi olmayan tasarımın&#8221; sınanması ve doğrulanması için kullanılır.</p>
<p><span style="text-decoration: underline;"><strong>Resmi olmayan (pratik) yaklaşım; </strong></span></p>
<p>Programcının zaman içinde edindiği bilgi ve deneyimleri sonucunda geliştirdiği veritabanı tasarımı yaklaşımını ifade eder. Programcıdan programcıya ufak tefek farklılıklar gösterse de, veritabanı genel olarak belli başlı adımlarla tasarlanır. Bunlar &#8220;resmi yaklaşım&#8221;dan daha pratik ve somut adımlardır.</p>
<p>Özetlemek gerekirse;</p>
<p>Resmi olmayan yaklaşımla somut olarak ortaya konan veritabanı, resmi yaklaşımla sınanarak doğrulanır. Uygulamanının veritabanı tasarımı ayağındaki genel süreç bu şekildedir.</p>
<p>Devam eden yazılarımda, yukarıda bahsettiğim &#8220;resmi olmayan&#8221; ve &#8220;resmi yaklaşım&#8221; bahsetmeye çalışacağım.</p>
<p>Sevgilerimle,</p>
<p>NOT: Yazının ikinci bölümü için:<br />
<a href="http://www.ibonette.com/veritabani-tasarimi-2-resmi-olmayan-pratik-yaklasim/" target="_blank">Veritabanı Tasarımı-2: Resmi Olmayan (Pratik) Yaklaşım</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ibonette.com/veritabani-tasarimi-1-veritabaninin-uygulamadaki-yeri-ve-veritabani-tasarimina-giris/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
