Ben bu blogu tasarlarken 1 hafta boyunca etiketler ve makale ilişkilerini nasıl yapacağımı düşündüm. Veritabanı tasarımı çok zorlamasa da Codeigniter ile kodlaması epey zamanımı aldı açıkçası. Bu makalede etiket bulutu için ideal veritabanı tasarımını anlatacağım.
Etiket bulutu için elimizde minimum 3 adet tablo bulunması gerekiyor.
yazilar tablosunu inceleyelim. Oluşturulacak sütunlar id, icerik, baslik, tarih ve projenize ait diğer sütunlar.
Bu tabloda işimize yarayacak olan sütun id sütunudur. Her yazının farklı bir id'si olmalıdır. Bu yüzden id sütunu primary key olmalıdır. Diğer sütunlar ise yazıyı tanımmlayan sütunlardır yani yazı içeriğini belirten icerik sütunu, yazı başlığını belirten baslik sütunu ve yazı tarihini belirten tarih sütunudur.
CREATE TABLE `yazilar` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`icerik` text NOT NULL,
`baslik` varchar(200) NOT NULL,
`tarih` date NOT NULL,
PRIMARY KEY (`id`)
);
etiketler tablosunu inceleyelim. Oluşturulacak sütunlar id, etiket ve hit sütunları.
Bu tabloda da her etikete özgü bir id değeri olmalıdır. Bu yüzden id sütunu primary key olacaktır. etiket sütunu ekleyeceğimiz etiketi içermelidir. hit sütunu ise o etiketten kaç adet bulunduğunu gösterir. Her satırda bir adet etiket tanımlanmalıdır.
CREATE TABLE `etiketler` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`etiket` varchar(50) NOT NULL,
`hit` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`)
);
yazi_etiket tablosunu inceleyelim. Oluşturulacak sütunlar yazi_id ve etiket_id sütunları.
İşin en önemli noktası bu tablo yani yazıları ve etiketleri birbirleriyle ilişkilendireceğimiz tablodur. yazi_id sütununda yazilar tablosundaki bir yazıya ait id, etiket_id sütununda ise etiketler tablosundaki bir etiket id'si olmalıdır ki yazı ve etiketi ilişkilendirebilelim.
CREATE TABLE `yazi_etiket` (
`yazi_id` int(10) unsigned NOT NULL,
`etiket_id` int(10) unsigned NOT NULL
);
Nasıl Kullanılabilir?
yazi_etiket tablosunun amacı yazilar ve etiketler tablosunun id'lerini tutmak ve gerektiğinde bu id'ler sayesinde hangi yazının hangi etiketleri olduğunu bulabilmek.
Örnek yazilar tablosu
Örnek etiketler tablosu
Örnek yazi_etiket tablosu
Tablolara göre 2 tane yazımız var. 1. yazı Android Başlığı ve 2. yazı PHP Başlığı. Android Başlığı adlı yazının sahip olduğu etiketler yazi_etiket tablosunda yazi_id'si 1 olan bütün satırlardır (etiket_id'si 4,3 ve 1 olan etiketler). Aynı şekilde PHP Başlığı adlı yazının sahip olduğu etiketler de yazi_etiket tablosunda yazi_id'si 2 olan bütün satırlardır (etiket_id'si 3,2 ve 1 olan etiketler). etiketler tablosuna dikkat ederseniz 2 yazının da ortak olan 2 tane etiketi vardır. Bunlar php ve android etiketleridir. Bu yüzden hit sütununda o etiketin karşısında 2 yazmaktadır.
Şimdi kısa bir örnek SQL sorgusu ile veritabanından nasıl veri çekebileceğinizi anlatıp yazımı bitireceğim.
SELECT e.etiket FROM yazi_etiket AS ye, etiketler AS e WHERE ye.yazi_etiket = "1" AND ye.etiket_id = e.id;
yazilar tablosundan id'si 1 olan yazının etiketlerini bu SQL sorgusu ile çekebiliriz. 1 yazan yeri istediğiniz yaznın id'si ile değiştirebilirsiniz.
YORUMLAR
SELECT e.etiket FROM yazi_etiket AS ye, etiketler AS e WHERE ye.yazi_etiket = \"etiketlerini istediğiniz makale id si\" AND ye.etiket_id = e.id;yazdığım sql sorgusuyla istediğiniz makalenin etiketlerini çekip yazdırabilirsiniz. en kısa zamanda bununla ilgili bir örneği makaleye ekleyeceğim.