2 Kasım 2013 Cumartesi

Veri Tabanı Yönetim Sistemleri (VTYS) I


Veri Tabanı Yönetim Sisteminin Nedir ?
Veri Tabanı Yönetim Sistemleri, fiziksel hafızada bilgileri çeşitli  özelliklerine göre gruplandırıp  
şekillendirdikten sonra saklayan programlardır.  VTYS, saklanan bu veriyi, Yapısal  Sorgulama komutları ile insanların istekleri çerçevesinde işler,  yeniden şekillendirirler. Yani,  Veritabanı Yönetim Sistemi’nin  bir ucunda, bilgisayar diskinde saklanan düzenlenmiş veriler,diğer ucunda ise bir kullanıcı(genellikle insan) veya istemci vardır.


Veri Tabanı Yönetim Sisteminin Yararları

- Aynı veri değişik kişilerin PC’lerinde veya değişik bilgisayarlarda tekrar tekrar tutulmaz; Veri Tekrarı (“Data Redundancy”) azaltılır ya da yok edilir.
- Veri Tutarlılığı (“Data Consistency”): Aynı verinin değişik yerlerde birkaç kopyasının bulunması “bakım” zorluğu getirir: bir yerde güncellenen bir adres bilgisi başka yerde güncellenmeden kalabilir ve bu durum veri tutarsızlığına (“Data Inconsistency”) yol açar.
- Veri Paylaşımı / Eşzamanlılık (“Concurrency”): Veri tabanı yönetim sistemi (VTYS) kullanılmadığı durumlarda veriye sıralı erişim yapılır. Yanı birden çok kullanıcı aynı anda aynı veriye erişemez. Bir VTYS’de ise aynı veritabanlarına saniyede yüzlerce, binlerce erişim yapılabilir.

- Veri Bütünlüğü (“Data Integrity”): Bir tablodan bir öğrenci kaydı silinirse, öğrenci var olduğu diğer tüm tablolardan silinmelidir.
- Veri Güvenliği (“Data Security”):  Verinin isteyerek ya da yanlış kullanım sonucu bozulmasını önlemek için çok sıkı mekanizmalar mevcuttur. Veri tabanına girmek için kullanıcı adı ve şifreyle korumanın yanı sıra kişiler sadece kendilerini ilgilendiren tabloları ya da tablo içinde belirli kolonları görebilirler. 
- Veri Bağımsızlığı (“Data Independence”):  Programcı, kullandığı verilerin yapısı ve organizasyonu ile ilgilenmek durumunda değildir. VERİ BAĞIMSIZLI-ĞI, VTYS’lerinin en temel amaçlarındandır.


Veri Tabanlarının Kullanım Yerleri

Veritabanı programlama ile bir çok proje geliştirilebilir.Bir İngilizce-Türkçe sözlük bu yolla kolayca yazılabilir. Bir kütüphane takip otomasyonu, bir hastane otomasyonu,muhasebe programları ve daha bir çok otomasyon programı temelde veritabanı projesidir.Günlük hayatta veritabanı programlama telefon şirketleri tarafından yoğun olarak kullanılır. Konuşmaların süreleri ay boyunca veritabanlarında saklanır ve ay sonu geldiğinde istemci programlar tarafından her bir abonenin telefon faturası teker teker hesaplanır. Günde yüz binlerce abonenin birbirini aradığı bir durumun içinden başka hangi yolla çıkılabilir ki?

Veritabanı, İlişkisel Veritabanları ve Veritabanı Tasarımı

 VERİTABANI NEDİR?
Bir okul; öğretmen ve öğrencilere ait kimlik bilgileri, ders programları, sınav sonuçları, yoklama raporları gibi bilgileri saklama gereksinimi duyabilir. Buna karşılık ticari bir firma ise; personel özlük bilgileri, depodaki malzemelere ait hareketler, müşterilerin telefon numaraları, gelen siparişler, gönderilen teslimatlar, ürün fiyatları gibi bilgileri de saklamak isteyebilir. Belirli bir düzen içinde korunmak istenen bilgilerin içeriği ne kadar farklı olursa olsun, ortak bir konu yada belirli bir amaçla ilişkili bilgilerin oluşturduğu bütüne Veritabanı denilmektedir.
Bir işletmenin günlük faaliyetlerini sürdürebilmesi için, işletmenin çeşitli konuları ile ilgili ve aynı zamanda işletmenin büyüklüğü ile de orantılı olarak, çok miktarda bilgi depolanması gerekebilir. Ancak bilgilerin sadece depolanması yeterli değildir. Bu bilgiler arasındaki ilişkilerinde saklanması gerekecektir. Çok büyük sayıdaki bilgilerin klasik dosya sistemi ile depolanması, tutulması mümkün olmadığı gibi veriler arasındaki ilişkilerin belirlenmesi de bir o kadar zordur.
Tasarımın önemli ilkelerinden biri olan veritabanının amacını ve ne için kullanılması gerektiğini belirledikten sonra, ortak bir hedefe yönelik verilerin gruplandırılarak tablolarda saklanması gerekir. Belirli bir konuyla ilgili olguların yer aldığı en temel veritabanı nesnesi olan tabloların amacı verileri depolamaktır. Ortak bir hedef dâhilinde farklı tablolarda yer alan verilerin, yeniden anlamlı biçimde bir araya getirilmesi gerekebilir. Bu işlemin gerçekleşebilmesi için tablolar arasındaki ilişkilerin tanımlanması gerekmektedir. İçerisinde yer alan tabloların birbirleriyle ilişkilendirildiği, tüm bilgileri tek tablo üzerinde barındırmayan, gereksiz tekrarlardan arındırılmış, güncelleme ve değişiklik yapılırken tüm veritabanının elden geçirilmediği, hızlı sorgulama yapılabilen, genişleme imkânları kısıtlı olmayan, esnek ve ortak bir amaca hizmet eden bir veritabanı İlişkisel Veritabanı olarak adlandırılabilir .

 VERİTABANI TASARIMI
Bir veritabanı tasarlarken mümkün olduğunca işlevsel olmasına dikkat edilmelidir. Bütün verileri tek bir tabloda toplamak hiçbir zaman amaca tam hizmet etmeyeceği gibi, her şeyin bir arada olması da veritabanının yönetilmesinde ve kontrolünde zorluklara, yapılmak istenilen değişikliklerin zaman almasına ve yapılacak sorgulamalarda zaman kaybına sebep olabilmektedir. Tabloları, sorguları ve diğer veritabanı nesnelerini oluşturmadan önce, tasarımı kâğıt üzerinde oluşturmak ve üzerinde çalışmak, ayrıca tasarımı düşünülen veritabanına benzeyen iyi kurgulanmış veritabanlarını, tabloları arasındaki ilişkileri de göz önünde bulundurarak incelemek iyi bir başlangıç olacaktır.
Veritabanı tasarlarken aşağıdaki temel ilkelerin belirtilen sırada uygulanması, tasarımdan beklenen amaca uygun sonuçların alınmasında önemli bir etken olacaktır.
 Veritabanının Amacını Belirleme
Veritabanı tasarlamada ilk adım, tasarımın amacını ve ne için kullanılması gerektiğini belirlemektir. Bunun için;
• Veritabanını kullanacak kişilerle konuşulmalı, tasarımcının ve kullanıcıların veritabanına sormak istediği sorular beyin fırtınası yöntemiyle toplanmalı,
• Veritabanının oluşturması istenilen raporların taslağı çizilmeli,
• Verileri kaydetmek için kullanılacak formlar bir araya getirilmelidir.
Veritabanının amacı belirlendiğinde, veritabanından istenilen bilgilerin listesi oluşmaya başlar. Bu listeden hareketle, veritabanında hangi olgulara ilişkin bilgilerin saklanması gerektiği ve her olgunun hangi konuyla ilgili olduğunun belirlenmesi gerekir. Bu olgular veritabanındaki alanlara (sütunlara) ve bu olguların ilgili olduğu konular da tablolara karşılık gelir.
Veritabanında Gerek Duyulan Alanları Belirleme
Her alan belirli bir konuyla ilgili bir olguyu içerir. Örneğin, müşteriler ile ilgili şirket adı, adres, şehir, ülke ve telefon numarası gibi olguların saklanması istenebilir. Bu olguların her biri için ayrı bir alan oluşturulması gerekebilir. Hangi alanlara gereksiniminiz olduğunu belirlerken, aşağıdaki tasarım ilkeleri unutulmamalıdır:
• Gerek duyulacak tüm bilgiler eklenmelidir.
• Bilgiler en küçük mantıksal parçalar halinde saklanmalıdır. Örneğin, çalışan adları çoğu kez Adı ve Soyadı gibi iki alana ayrıldığından, verileri Soyadı'na göre sıralamak daha kolaydır.
• Birden çok öğenin yer aldığı listelerden oluşan veriler için alan oluşturulmamalıdır. Örneğin, bir tedarikçiler tablosunda, tedarikçiden alınan her ürününün virgülle ayrılmış listesini içeren bir Ürünler alanı oluşturulursa, yalnızca belirli bir ürünü sağlayan tedarikçileri bulmak çok daha zor olacaktır.
• İfade sonucu oluşan türetilmiş veya hesaplanmış veriler eklenmemelidir. Örneğin, BirimFiyat ve Miktar alanları varsa, bu iki alandaki verileri çarpan ek bir alan oluşturulmamalıdır.
• Birbirine benzeyen alanlar yer almamalıdır. Örneğin, Tedarikçiler tablosunda Ürün1, Ürün2 ve Ürün3 isimli alanlar oluşturulursa, belirli bir ürünü sağlayan tüm tedarikçileri bulmak çok daha zor olacaktır. Ayrıca, belirli bir tedarikçi üçten çok ürün sağlarsa, veritabanının tasarımını değiştirmek gerekecektir. Bu alan Tedarikçiler tablosu yerine Ürünler tablosuna yerleştirilirse, ürünler için yalnızca bir alana gereksinim olacaktır.
Veritabanında Gereksinim Duyulan Tabloları Belirleme
Her tablo ortak bir konu ya da belirli bir amaç hakkında bilgi içermelidir. Alan listesi, gereksinim duyulan tablolara ilişkin ipuçları sağlar. Örneğin, bir İşeAlmaTarihi alanı varsa, bu alanın konusu bir çalışandır ve bu nedenle de Çalışanlar tablosuna aittir. Müşteriler için bir tablo, Ürünler için bir tablo ve Siparişler için farklı bir tablo veritabanında yer alabilir.
 Her Bir Alanın Hangi Tabloya Ait Olduğunu Belirleme
Her bir alanın hangi tabloya ait olacağına karar verilirken şu tasarım ilkeleri göz önünde bulundurulmalıdır:
• Alan, yalnızca tek bir tabloya eklenmelidir.
• Tablonun birçok kaydında görünen bilgilerin aynısını verecekse, alan bir tabloya eklenmemelidir. Tablodaki bir alanın çok miktarda yinelenen bilgi içereceği belirlenirse, o alanın yanlış tabloda olma olasılığı çok yüksektir.
Örneğin, bir müşterinin adresini içeren bir alan Siparişler tablosuna eklenirse, müşteri birden çok sipariş verdiğinde bu bilgiler birden çok kayıtta yinelenebilecektir. Bununla birlikte, adres alanı Müşteriler tablosuna koyulursa, yalnızca bir kez görünür. Bu bakımdan, bir veritabanındaki bir tablo, çalışma sayfası gibi düz bir dosya veritabanındaki bir tablodan farklıdır.
Her bilgi parçası yalnızca bir kez saklandığında, bu bilgi tek bir yerde güncelleştirilebilir. Bu daha faydalıdır ve böylece farklı bilgi içeren yinelenen giriş olasılığı da ortadan kalkmış olur.
Alanı Her Kayıttaki Benzersiz Değerlerle Tanımlama
İlişkisel bir veritabanı, farklı tablolarda saklı bilgileri bağlamak için, örneğin, çalışanların aldığı sipariş talepleri ile çalışanları ilişkilendirmek için, veritabanındaki her tablo veya tablodaki her ayrı kaydı benzersiz olarak tanımlayan bir alan veya alanlar kümesi içermelidir. Bu tür bir alana veya alanlar kümesi birincil anahtar olarak adlandırılır.
Birincil anahtar benzer bilgileri birbirinden ayıran ve her kaydı benzersiz kılan bir tanımlayıcıdır. Ayrıca bilgileri bir araya getirir. Bir tablo, birincil anahtar kullanılarak başka
bir tabloyla ilişkilendirilebilir. Tablolar bu şekilde veri paylaşır ve her iki tabloda da verilerin yinelenmesini engellenmiş olur. Birincil anahtarlar, bakımı zor olan ve birlikte çalışmayan çok sayıda yinelemeli listelerle çalışmak yerine ilişkisel veritabanlarının gücünden yararlanmaya olanak sağlar.
Anahtar alanların seçiminde, tasarımcıyı kısıtlamadığı sürece, doğal alanların tercih edilmesinde önemli fayda vardır. Örneğin, araçlar ile ilgili bir tablo oluştururken, plakalar anahtar alan olarak belirlenebilir. Çünkü her bir plakadan bir tek araç trafiğe çıkabilir. Bu tasarımcıyı kısıtlamaz. Öğrenci tablosu için, öğrenci numarası doğal bir anahtar alandır, çünkü aynı okulda, aynı numaradan bir öğrencinin daha bulunması söz konusu değildir.
Tablolar ilişkili olduğunda, bir tablonun birincil anahtarı diğer tablonun yabancı anahtarı olmaktadır.
Yinelenen Bilgi İçeren Alanlar İçin Ek Tablo Oluşturma
Veritabanı için gereksinim duyulan alanlar ve bu alanların yer alacağı tablolar belirlendikten sonra her hangi bir alanda tekrarlanan verilerin oluşması, tasarımında en sık karşılaşılan veri tekrarı hatasının olduğunu göstermektedir. Tasarımın hatasız olabilmesi, yinelemenin olduğu bu tablonun en az bir tabloya daha ayrılmasıyla mümkün olabilir. Tasarımın bu önemli ilkeleri dâhilinde unutulmamalıdır ki, her veritabanı projesine uyacak evrensel bir tasarım tekniği yoktur. Dolayısıyla iyi bir tasarım bu kurallar çerçevesinde tasarımcının ne kadar teferruatlı düşünebildiğine bağlıdır.
Anahtar Alana Bağlı Olmayan Alanları Belirleme
İlişkisel veritabanlarında, tablodan herhangi bir tek kayda erişmek için mutlaka bir farklı özellik sağlanmalıdır ve bu özellik de anahtar alan vasıtasıyla gerçekleşir. Ancak bazen, anahtar alan ile aynı tabloda yer aldığı halde, anahtar alan ile birebir ilişkisi olmayan bir alan bulunabilir. Bu türden alanları elimine edip ayrı tablolara ayırmak gerekmektedir.
Örneğin, bir kütüphane bilgilerini içeren veritabanı tasarımında, Ödünç tablosunu ele alacak olursak, ödünç verilen her kitap için ödünç alanın adresi de bilinmek istenebilir, ancak bu bilgi Ödünç tablosuna yazılmamalıdır. Çünkü Ödünç tablosunun birincil anahtar alanı, uygun bir doğal alan olmadığı için ödünç verme sayısını tutan OduncNo alanı olacaktır. Dolayısıyla bu alana yazılacak bilgi, ödünç verme işlemi ile doğrudan ilgilidir. Oysa ödünç alanın adres bilgisi, ödünç alan kişinin kendisine bağlı bir özelliğidir. Bu kişinin her aldığı kitap için adresini tekrar tekrar yazmaya gerek yoktur. Aynı şekilde otomasyon içerisinde başka yerlerde de bu kişinin adres bilgilerine muhtemelen ihtiyaç duyulabilir çünkü adres Ödünç tablosunun değil, üyenin bir özelliğidir.
Tablolar Arasındaki İlişkileri Belirleme
Veritabanında yer alacak bilgileri farklı tablolara belirli konu başlıklarına göre ayırıp, birincil anahtar alanlarını belirlendikten sonra veritabanımıza ilgili bilgileri ayrı tablolardan yeniden anlamlı biçimde bir araya getirmesini söyleyebilmek için, tablolar arasında ilişkilerin belirlenmesi ve tanımlanması gereklidir. Her biri bir konuya dair verileri barındıran tabloların tümü göz önüne alınmalı ve birbirleri ile olan ilişkileri tanımlanmalıdır. Örneğin, kütüphanede bulunan bir kitabı ödünç verebiliriz. Bu durumda, Ödünç tablosu ile Kitap tablosu arasında bir ilişki olacaktır. Kitapların üyelere ödünç verilmesinden dolayı, Ödünç tablosu ile Üyeler tablosu arasında da bir ilişki tanımlanmalıdır. Kitaplar ile üyeler arasında ortak bir amaca yönelik herhangi bir bilgi olamayacağından dolayı bu iki tablo direkt bir ilişki içinde değildir, ancak dolaylı olarak Ödünç tablosu üzerinden bir birlerine bağlıdırlar.
Tasarımı Geliştirme
Tasarımı yapılan veritabanında gerek duyulan tablolar, alanlar ve tablolar arası ilişkiler belirlendikten sonra, sıra tasarım üzerinde çalışmaya ve olabilecek hataları araştırmaya gelmiştir. Veritabanı tasarımını şimdi değiştirmek, tabloları veriyle doldurduktan sonra değiştirmekten daha kolaydır. Kullanılacak Veritabanı Yönetim Sisteminde tasarlanan yapıyı oluşturduktan sonra henüz veri girişi yapılmadan veritabanındaki ilişkileri denemek için, istenilen yanıtları almak amacıyla sorgular oluşturup oluşturulamayacağı denetlenmeli, formların ve raporların taslakları oluşturulup beklenilen sonuçları gösterip göstermediği kontrol edilmelidir. Ve son olarak veritabanının iyileştirilmesi ve esnek bir tasarımın olabilmesi için eğer varsa gereksiz yinelenen veriler tespit edilmeli ve ortadan kaldırılmalıdır.
Tasarımı İyileştirme
• Tablolara isim verirken mümkün olduğu durumlarda tekil isimler kullanılmalıdır. Böylece hem daha anlaşılır bir tasarım yapılmış hem de daha sonra kodlama aşamasında karşılaşılabilecek karışıklığın önüne geçmiş olunur. Örneğin, içinde kitap ile ilgili bilgiler bulunduracak tablonun adını Kitap koymak oldukça mantıklıdır.
• Tabloların yapısını oluştururken ilk sıraya o tablo için birincil anahtar olarak belirlenen alanı yerleştirmek bir kural değildir ancak tablonun okunabilirliği ve göze hoş görünmesi açısından tercih edilmesi, iyi bir tasarım için yararlı olacak bir tekniktir.
• Bir tablo için doğal bir anahtarın belirlenemediği durumlarda tabloya, yapay birincil anahtar alan eklenir. Bu anahtar alan isimlendirilirken genellikle tablo adı ile başlar ve sonuna ID ifadesi eklenir. Örneğin, Sipariş tablosunda her bir siparişi birbirinden benzersiz kılan bir doğal anahtar bulunmadığı durumlarda, birincil anahtar olarak atanan yapay anahtara SiparisID ismi verilebilir.
• Farklı tablolarda yer alan iki alan aynı veriyi tutuyorsa, iki alana da aynı ismi vermek, karışıklığa yol açabilir gibi görünse de aslında bu sayede daha düzgün bir yapı ortaya çıkar. KitapNo alanı, Kitap tablosunda da Ödünç tablosunda da kitap numarası tutmaktadır. Bu alanlardan birine KitapNo diğerine OduncGidenKitapNo demek, karışıklığa neden olabilir. En iyi seçim her iki tabloda ortak veri tutan alanlara aynı ismi vermektir.
 SONUÇ
Veritabanları ana hatlarıyla, veriyi verimli şekilde depolamayı ve bilgiye dönüştürmeyi amaçlayan sistemlerdir. Veritabanı sistemleri, günümüzde hemen her gün kullandığımız birçok yerde karşımıza çıkmaktadır. Faturalarımızın ödenmesi, sinema rezervasyonları yada sıklıkla kullandığımız e-posta işlemlerinin temelinde bir veritabanı bulunmaktadır. Büyük veya orta ölçekli bir veritabanı projesinin geliştirilme sürecinde doğruluk, güvenlik, verimlilik hayati önem taşımaktadır. Hataların oluşmasını engellemek ve esnek bir veritabanı tasarımına sahip olmak için on adımda anlatılan bu tasarım ilkelerinin belirtilen sırada uygulanması gerekir. Tasarımın bu önemli ilkeleri dâhilinde unutulmamalıdır ki, her veritabanı projesine uyacak evrensel bir tasarım tekniği yoktur. Dolayısıyla iyi bir tasarım bu kurallar çerçevesinde tasarımcının ne kadar teferruatlı düşünebildiğine bağlıdır.

RSS Formatının İncelenmesi

Günlük haber ihtiyacınıkarşılamak isteyen Internet kullanıcıları, onlarca Internet sitesini ziyaret etmek için
çoğu zaman saatler harcarlar. Siteye gitmek, haberleri aramak, okumak, gerektiğinde kaydetmek ve sonraki
sayfaya geçmek vakit alıcıdır. Bir diğer seçenek ise haber gruplarına üye olmaktır. Ancak bu sefer de e-posta adresleri verildiği için spam ve virüs gönderilmesi  tehlikesiyle karşıkarşıya kalınabilmektedir .
Yeni bir bilgi paylaşım teknolojisi olan RSS’de tam bu noktada devreye girmekte ve bu olumsuz tüm durumlar ile Internet kullanıcılarının karşıkarşıya gelmelerini engellemektedir. Açılımı“Really Simple Syndication” (Gerçekten Basit Dağıtım) veya “Rich Site Summary” (Zengin İçerikli Site Özeti) olan RSS, iki açılımda da tek bir şeyi ifade etmektedir: Paylaşıla bilgilerin, e-posta karmaşasından ve siteleri dolaşma stresinden kurtarılıp, en kısa yoldan en fazla kişiye ulaştırılabilmesidir . “RSS-Feeds” veya “RSS-Channels” (RSS Kanalları) her şeyden önce newsletter, yani haber bülteni şeklinde gönderilmemekte; tam tersine, bir RSS okuyucusu tarafından haberin yayınlandığısayfadan alınıp gösterilmektedir. Haberler, bir başlık ve logoyla XML formatında gönderilmektedir. Okunmak istenilen haberin başlığına tıklanarak haberin tamamını içeren HTML formatında hazırlanmış Internet sayfasına ulaşılabilmektedir. Bu tür bir haber alma yoluna gidenler için masraflar yok denecek kadar azdır.  İnternet sayfasıiçin hazırlanan haberler, bir uygulama tarafından tam otomatik olarak açılıp, RSS için uygun olan XML formatına dönüştürülmektedir. Bu XML verisi okuyucu için gerekli bağlantıları, başlıkları ve markalamalarıda içermektedir. Her yeni haber önderimiyle birlikte, XML verisi de yeniden yazılmakta ve eski kayıtlar silinmektedir. Bu şekilde, çoğu haber yenilemesinden sonra bile haber gönderimini hızlandırmak için veri boyutu düşük tutulmuş olmaktadır.

XML 
Web sayesinde öğrenilen en önemli bilgilerden biri, veri ve etkileşimleri tanımlamaya yönelik oluşturulan
standartların (HTML gibi) çözümleri özel teknolojilere oranla çok daha geniş kitlelere ulaştırabilirliğidir.
Genişletilebilir İşaretleme Dili (XML - Extended Markup Language), Web’deki yapılandırılmış verilere yönelik evrensel bir biçimdir. XML, veriler için oluşturulması ve bir bilgisayar tarafından okunması kolay olan, anlam karmaşası yaratmayan ve platformdan bağımsız çalışabilen dosyalar oluşturabilecek  şekilde metin
biçimleri tasarlamaya yarayan kurallar bütünüdür. Şu anda bir Web uygulaması başka bir uygulamadan veri
alıp görüntülemek isterse genellikle ‘‘screen-scraping’’yardımına başvurur, istediği verinin bir ekran
görüntüsünü yakalar ve bu resmi veri için tekrar nasıl anlamlandıracağını bulmaya çalışır. Bu yöntem hem
verimsizdir hem de hatalara yol açar. XML, verinin sadece resimlerini göndermek yerine gerçek veri
alışverişinin oluşabilmesi için XML Web servislerine yönelik bir biçim sağlar . Microsoft, XML’in ilk planlama aşamalarından beri XML’i bünyesine dahil etmiştir; XML şu anda HTML’in ve pek çok diğerlerinin teknik özelliklerini de belirleyen resmi standartlar organıolan Dünya Çapında Web Konsorsiyumu (W3C - Worldwide Web Consortium) tarafından yönetilmektedir .


RSS 
XML sayesinde verilerin paylaşımı ve yönetimi oldukça kolay bir hal almıştır. Geniş ama basit XML dünyasında istenilen her türde bilgi kolayca yönetilebilmektedir. RSS ise XML yapısı üzerine kurulu bir veri biçimlendirme standardıdır. 1990'larda Netscape tarafından bazı basit verilerin paylaşılması için geliştirilmiş, sonrasında Userland sayesinde popülaritesini kazanmıştır. Önceleri bu format çoğu geliştirici ve yazılımcı
tarafından benimsenmemiş ve bunda en büyük etken, Netscape firması tarafından yapılan bazı kısıtlamalar ve
formatın ücretli olmas ıolmuştur. Buna karşılık olarak Dave Winner ve bir grup yazılımcı RDF (Resource
Description Framework) tabanlıyeni bir format olan RSS 0.92’yi yaratmışlardır. Daha sonraları Netscape firması tarafından bu ücretsiz sürüm ile başa çıkılamayacağının anlaşılması ile RSS projesini bırakılmış ve RSS bugünkü haline ulaşmıştır. Bugün hala RSS v0.92 en popular format olma özelliğini korumaktadır .
Paylaşılmak istenilen her türlü bilgi için vazgeçilmez biçimlendirme standardı olan RSS ile;
•  Internet kullanıcıları en hızlı biçimde bilgiye ulaşabilmekte,
•  Site sahibi, içeriğini çok daha fazla kişiye ulaştırabilmekte,
•  Satış yapan siteler, müşterilerini e-postadan çok daha hızlı bir şekilde bilgilendirebilmekte,
•  Yöneticiler, sitelerine kolayca içerik sağlayabilmektedirler.

RSS’İN YAYINCILIK İÇİN ÖNEMİ
XML'in yayıncılık açısından belki de en ilgi çekici kullanım alanı olan RSS, basit XML etiketleri sayesinde,
bir Web sitesinde yakın zamanda nelerin değiştiğini görebilmeyi sağlamaktadır. “Aggregator” adı verilen
programlar RSS özellikli siteleri tarama ve değişiklikleri kullanıcıya aktarma görevini üstlenmektedirler. Veri
Dağıtım (Syndication) Biçimi olan RSS günümüzde artık anasayfa denilen kavramıda değiştirmektedir. Çünkü okunmak istenenler, sitelerdeki değişikliklerle ilgili bilgi pencereleri sayesinde, gerekli haberdar etme durumunu da sağlayabilmekte ve böylece kullanıcılar tarafından çok geniş bir bilgi ağı sürekli özlenebilmektedir .

BİR RSS DOSYASININ YAPISI 
Sitelerin içeriklerini veya paylaşılan bilgileri başlıklar halinde sunmak için kullanılan RSS teknolojisinin
temelini, bir XML dosyasıoluşturmaktadır. Bir RSS dosyasının genel yapısıaşağıdaki  şekilde oluşturulmalıdır;
1.  XML Giriş açıklayıcı bölümü,
2.  RSS sürümünün belirtildiği kısım,
3.  RSS'in ait olduğu siteye ait açıklayıcıbilgi bölümü,
4.  Paylaşılmak istenilen konular.
Basit bir RSS dosyasıaşağıdaki bilgi alanlarını içermelidir.























RSS 0.91 sürümünde bir dosyada en fazla 15 konu başlığına izin verilmekte ve 100 veya 500 karakterlik
kısıtlamalar bulunmakla birlikte, RSS’in 0.92 sürümünde  bu sınırlamalar bulunmamaktadır. RSS v2.0 da ise daha fazla açıklayıcı etiket kullanmak mümkün olmaktadır [8]. RSS'den haberdar uygulamalara (Firefox Browser veya Arama Motorları) sitenizde RSS desteği verdiğinizi bildirmek için, sayfanızın <head> ve </head> tagları arasına aşağıdaki satırlar eklenmelidir.

Microsoft .NET ve Entegrasyon


.NET 
Standart XML ve Internet protokolleri entegrasyonu üzerine kurulu olan Microsoft .NET 
platformu, gelişmiş yeni kuşak yazılım geliştirme amaçlı kullanılabilecek devrim niteliğinde 
bir model sunmaktadır. Daha önceleri, programlama modelleri tek bir sistem üzerinde 
odaklanmakta ve hatta diğer sistemlerle etkileşime engel olmaktaydı. Microsoft .NET ise 
Internet üzerindeki kaynak gruplarının entegrasyonu ve birbirleriyle uyum içerisinde 
çalışmasına olanak vererek tek bir çözüm sunmak üzere tasarlanmıştır. 
.NET, Microsoft'un pazarladığı gelecek kuşak uygulama geliştirme araçları sürümünün 
ötesinde bir anlama sahiptir. Internet'i işletim sistemi haline getiren .NET, hem işletim sistemi, 
hem de Internet düşüncesinin kapsamını genişletmektedir. Uygulamalarımızı güncelleyerek 
ve .NET üzerinde yazılım geliştirme çalışmasıyaparak, yepyeni performans olanaklarından 
ve gelişmiş özelliklerden yararlanabilecek, bu sayede uygulama geliştirme süresinden 
tasarrufu sağlayabilecek, XML Web Servisleri gibi yeni uygulama sınıfları oluşturabilecek, 
Web üzerinde dosya saklama ve kullanıcı tercihi yönetimi gibi yeni yapıtaşı servislerinden 
istifade edilebilecektir [2]. 
Microsoft .NET platformu çok katmanlı ve dağıtık uygulama geliştirme modellerini 
benimsemiştir [4]. .NET mimarisini aşağıdaki şekilde ifade edebiliriz: 


Visual Studio .NET, Microsoft'un ve dünyanın her yerindeki uygulama geliştiricilerinin bu 
yeni hizmet sınıflarını oluşturabilmesini sağlayan yeni kuşak araçlardan oluşan bir uygulama 
geliştirme ortamı sunmaktadır [5]. 
.NET platformunda Visual Studio .NET tarafından kullanılabilen hazır nesne kütüphaneleri 
bulunmaktadır. Bu kütüphaneler, System adıverilen isim alanı ile temsil edilmektedir. Bu 
isim alanı kendi içinde alt isim alanlarından meydana gelmektedir. Herhangi bir isim alanı
içinde alt isim alanları ve sınıflar bulunmaktadır. Örneğin, System isim alanı altında, 21 tane 
alt isim alanı ve 147 tane sınıf vardır. System isim alanında bulunan alt isim alanlarına örnekler 
ve bu isim alanlarının temel kullanım amaçları aşağıdaki tabloda özetlenmektedir. 

İsim Alanı
Temel Kullanım Amacı
System.CodeDom
Kaynak kod dokümanının yapısınıve bileşenlerini sunmak için kullanılan sınıfları destekler
System.Collections
Nesne koleksiyonlarını, (Örneğin listeler, kuyruklar, dizeler,
hash tabloları, e-sözlükler) yönetme olanağı sağlayan sınıfların bir setini içerir.
System.ComponentModel
Çalışma zamanlıve tasarım zamanlıdavranışgösteren
bileşenleri kullanabilmek için gerekli olan sınıfları destekler.
System.Configuration
.NET Framework konfigürasyon ayarlarına programsal olarak erişime izin veren arabirim ve sınıfları içerir.
System.Data
Veritabanlarına erişim için ADO.NET mimarisini oluşturan sınıflardan meydan gelir.
System.Diagnostics
Hata ayıklama, izleme, sistem prosesleriyle etkileşim, olay
günceleri ve performans ölçerler için kullanılan sınıfları sağlar.
System.DirectoryServices
Yönetilebilen koddan ActiveDirectory’e kolay erişimi sağlar
System.Drawing
GDI+ temel grafik işlevine erişim sağlayan sınıfları içerir. (Hiyerarşik olarak System.Drawing ad uzayının altındaki ad uzayları, System.Drawing.Text ve System.Drawing.Drawing2D dahil,daha ileri düzey ve özel  GDI+ grafik işlevi sağlarlar)
System.Globalization
Dil, ülke, takvim vb. gibi kültürel ve yöresel bilgileri tanımlayan sınıfları kapsar.
System.IO
Akışlara ve dosyalar üzerinde senkron/asenkron okuma ve yazma için kullanılan tipleri, sınıfları ve genel girdi/çıktı(I/O) işlevini içerir.
System.Net
Ağ sistemlerinde kullanılan protokollerin birçoğu için kolay programlana bilen arabirimleri destekler.
System.Reflection
Tip denetimi ve nesneleri dinamik olarak bağlama  yeteneği  sağlayan sınıf ve arabirimleri içerir.
System.Resources
Geliştiricilere, bir uygulamada kullanılan farklı kaynakların yaratılması, depolanması ve yönetilmesini sağlar.
System.Runtime
.NET altyapısında programların çalışmasını kontrol  eden Ortak Dil Çalışma Platformu (CLR) ile ilgili işlevleri içerir.
System.Security
.NET Framework güvenlik sisteminin yapısını vurgulayan izinler için gerekli sınıfları kapsar.
System.Text
ASCII, Unicode, UTF-7 veUTF-8 karakterlerin
çözümlenmesini sağlayan sınıfları destekler. Karakter kodlaması, karakter bloklarını byte  bloklarına  dönüştürme ve daha fazlası için kullanılan sınıfları içerir.
System.Threading
Çoklu süreçli (MultiThread) programlamaya imkân veren sınıf ve arabirimleri destekler.
System.Timers
Tanımlanmış bir zamanda bir olayı gerçekleştirmek için gerekli olan Timer bileşenini sağlar.
System.Web
Tarayıcı sunucu iletişimini ve Web ile ilgili diğer işlevleri  kolaylaştıran sınıflar içerir.
System.Xml
XML’i işlemek için standart destek sağlar.
System.Windows.Forms
Windows işletim sisteminde çok kullanıcılı Windows tabanlı uygulamalar yaratmak için gerekli sınıfları destekler.
Her bir isim uzayı belli bir uygulama alanına yönelik olarak hazır nesne kütüphanesi görevini 
üstlenmektedir. Örneğin, System.Data isim uzayı veritabanlarına erişim amacıyla hazırlanmış
bir nesne kütüphanesini temsil ederken, System.Xml isim uzayı, XML verilerini işlemek 
amacıyla kullanılan sınıfların bulunduğu hazır nesne kütüphanesini temsil etmektedir. 

ENTEGRASYON REHBERİ
.NET ile birlikte isim alanı denilen hazır nesne kütüphaneleri sayesinde, uygulama 
geliştiricilerin kendi uygulamalarında kullanmaları için yer alan alt isim alanları, sınıflar, 
yapılar ve arayüzler gibi elemanlar sunulmaktadır. Entegrasyon rehberinin ana fikri, .NET’in 
sunduğu isim alanlarının, dersler ile konu içeriklerine bağlı olarak eşleştirilmesini sağlamaktır. 
Bu bölümde, 2. bölümde genel konu başlıkları verilen dersler için bu entegrasyonun nasıl 
gerçekleştirilebileceği aktarılmaktadır. 
.NET ve Bilgisayar Teknolojisi ve Programlama eğitimini bu seviyede entegre edebilmek için 
ilk şart, .NET isim uzayındaki elemanlar ile ilgili bilgi sahibi olmaktır. Bu nedenle, herhangi 
bir isim uzayında sunulan hazır nesne kütüphanesindeki elemanların hangi amaçla 
kullanıldığının bilinmesi gerekmektedir. 
Tablo 2’de Bilgisayar Teknolojisi ve Programlama eğitimi kapsamında yer alan bazı derslerin 
konu içeriklerine göre,System isim alanında bulunan hazır nesne kütüphanesi elemanları ile 
ilişkilendirilmesi yer almaktadır. 

Tabloda  Derslerin .NET ile entegrasyonu belirtilmiştir.

Ders İsimleri
İlgili İsim Alanı Elamanları
Algoritma ve Programlamaya Giriş
System.Console
System.Array
Veri Yapılar ve Programlama
System.Array
System.Collections
System.IO
System.Runtime
Görsel Programlama
System.Convert
System.Exception
System.Diagnostics
System.DirectoryServices
System.Net
System.Text
System.Timers
System.Windows.Forms
Internet Programcılığı
System.Web
System.Xml
Veritabanı Yönetim Sistemleri
System.Data
System.Data.SqlClient
System.Data.SqlTypes
System.Data.OleDb
System.Xml
Entegrasyon rehberinde sunulan tablolardaki bilgiler entegrasyonun son halini gösteren 
bilgiler olmayıp sadece bir rehber niteliği taşımaktadır. Bu nedenle bu rehberden faydalanmak 
isteyen öğretim elemanlarının entegrasyonu tamamlamak için ilgili isim uzaylarının 
detaylarını öğrenmeleri gerekmektedir. Bu rehber sadece bir yol gösterici olarak 
sunulmaktadır. 

1 Kasım 2013 Cuma

LINQ Sorgulama Örnekleri

LINQ (Language Integrated Query - Dile Entegre Edilmiş Sorgulama), .NET Framework 2.0 sürümünde eklenti paketleriyle kullanılabilen .NET Framework 3.5 sürümü ve sonrasında ise tanımlı olarak gelen bir özelliktir.

Linq sorguları aşağıdaki gibi gruplandırılabilir:
  • RestrictionOperators (Kısıtlama Operatörleri )
  • GroupingOperators (Gruplandırma Operatörleri)
  • AggregateOperators (Gruplama Fonksiyonu Operatörleri)
  • ProjectionOperators (Seçme Operatörleri)
  • Set Operators (Set Operatörleri)
  • Conversion Operators (Dönüştürme Operatörleri)
  • PartitioningOperators (Bölümleme Operatörleri)
  • Element Operators (Eleman Operatörleri)
  • MiscellaneousOperators (Çeşitli Operatöler)
  • GenerationOperators (Üretim Operatörleri)
  • Query Execution (Çalıştırma Operatörleri)
  • OrderingOperators (Sıralama Operatörleri)
  • Quantifiers (Ölçüm Operatörleri)
  • JoinOperators (Birleştirme Operatörleri) 
Aşağıda bu gruplara ilişkin örnekler ve örneklerin oluşturduğu çıktılar verilmiştir.
1.       RestrictionOperators (Kısıtlama Operatörleri)

public void LinqRestriction()
{
    
int[] sayilar = { 51, 14, 1, 73, 7, 5, 10, 7, 4, 6 };       
    
var KucukSayilar =  from k in sayilar
                                  
where k < 5
                                  
select k;
        Console.WriteLine("Sayilar< 5:");
        
foreach (var x in KucukSayilar)
        {
             
Console.WriteLine(x);
        }
}


    
        
2.       GroupingOperators (Gruplandırma Operatörleri)

public void LinqGrouping()

     
string[] kelimeler = { "kısıtlama""gruplama""seçme""sıralama""ölçüm","eleman" };
     
var KelimeGrup = from s in kelimeler
                              
group by s[0] into k
                              
select new { FirstLetter = k.Key, Kelimeler = k };    
    
foreach (var k in KelimeGrup)
    {
         
Console.WriteLine("İlk harfi '{0}' olan kelimeler:", k.FirstLetter);
         
foreach (var s in k.Kelimeler)
         {
               Console.WriteLine(s);
         }
     }

 }
   
3.       AggregateOperators (Gruplama Fonksiyonu Operatörleri)
public void LinqAggregate()
{
      
string[] kelimeler = { "kısıtlama""gruplama""seçme" };
      
int EnKısaKelime = kelimeler.Min(w =>w.Length);
      Console.WriteLine("En kısa kelime {0} karakter uzunluğundadır.", EnKısaKelime);

 }
4.       ProjectionOperators (Seçme Operatörleri)

public void LinqProjection()
{
      
string[] Kelimeler = { "kIsItlaMa""GRUpLama""SeçME" };
          
var BuyukKucukKelimeler = from k in Kelimeler
          
select new { BuyukHarf = k.ToUpper(), KucukHarf = k.ToLower() };
               
foreach (var bk in BuyukKucukKelimeler)
               {
                     
Console.WriteLine("BüyükHarf: {0}, KüçükHarf: {1}", bk.BuyukHarf, bk.KucukHarf);
                }
}
5.       Set Operators (Küme Operatörleri)

public void LinqSet()
{
     
int[] SayilarA = { 1, 2, 3, 4, 5, 6, 7 };
     int[] SayilarB = { 1, 3, 5, 7, 9 };
     var OrtakSayilar = SayilarA.Intersect(SayilarB);
     Console.WriteLine("İki dizide ortak olan sayilar:");
     foreach (var o in OrtakSayilar)
     {
          
Console.WriteLine(o);
     }
}
6.       Conversion Operators (Dönüştürme Operatörleri)

public void LinqConversion()
{
     
string[] kelimeler = { "kısıtlama""gruplama""seçme" };
     
var SiraliKelimeler =  from k in kelimeler
                                     
orderby k
                                     
select k;
     
var KelimeListesi = SiraliKelimeler.ToList();
     
Console.WriteLine("Sıralı kelime listesi:");
     
foreach (var k in KelimeListesi)
     {
           
Console.WriteLine(k);
     }
}


7.       PartitioningOperators (Bölümleme Operatörleri)
public void LinqPartitioning()
{
     
int[] sayilar = { 3, 4, 2, 3, 9, 4, 5, 8, 2, 8 };
     var
 BestenKucukIlkSayilar = sayilar.TakeWhile(n => n < 5);
     
Console.WriteLine("5'ten küçük ilk sayilar:"); 
     foreach
 (var n in BestenKucukIlkSayilar)
     { 

           Console
.WriteLine(n);
     } 

}
8.       Element Operators (Eleman Operatörleri)

public void LinqElement()
{
     
string[] kelimeler = { "kısıtlama""gruplama""seçme""sıralama""ölçüm","eleman"};
     string
 kIleBaslayan = kelimeler.First(s => s[0] == 'k'); 
     Console
.WriteLine("'k' ile başlayan kelime: {0}", kIleBaslayan);
}


9.       MiscellaneousOperators (Çeşitli Operatöler)

public void LinqMiscellaneous()
{
     
int[] SayilarA = { 1, 2, 3, 4, 5, 6, 7 };
     
int[] SayilarB = { 1, 3, 5, 7, 9 };
     
var TumSayilar = SayilarA.Concat(SayilarB);
     Console
.WriteLine("Bütün dizilerdeki tüm sayilar:");
     
foreach (var n in TumSayilar)
     {
           
Console.WriteLine(n);
     }
}

10.   GenerationOperators (Üretim Operatörleri)

public void LinqGeneration()
{

     var
 Sayilar = Enumerable.Repeat(5, 15); 
     foreach
 (var n in Sayilar)
     {
          
Console.WriteLine(n);
     }
}


11.   Query Execution (Çalıştırma Operatörleri)

public void LinqQuery()
{  
     
int[] sayilar = new int[] { 6, 4, 2, 3, 9, 4, 5, 8, 2, 8 };
     
int i = 0;
     var
 q = (from n in sayilar
                 select
 ++i) .ToList();
     
foreach (var v in q)
     {
          
Console.WriteLine("v = {0}, i = {1}", v, i);
     }
}

12.   OrderingOperators (Sıralama Operatörleri)

public void LinqOrdering()
{
     
string[] kelimeler = { "kısıtlama""gruplama""seçme" };
     
var SiraliKelimeler = from w in kelimeler
                                    
orderby w.Length
                                    
select w;
     
Console.WriteLine("Uzunluğuna göre sıralı kelime listesi:");
     
foreach (var w in SiraliKelimeler)
     {
          
Console.WriteLine(w);
      }
}


13.   Quantifiers (Ölçüm Operatörleri)

public void LinqQuantifiers()
{
     
int[] sayilar = { 6, 4, 2, 4, 8, 2, 8 };
     
bool SadeceCift = sayilar.All(n => n % 2 == 0);
     
Console.WriteLine("Liste sadece çift sayılardan oluşur: {0}", SadeceCift);
}

14.   JoinOperators (Birleştirme Operatörleri)

class Program
{

     static
 void Main(string[] args)
     {
          
List<Kitap>KitapList = new List<Kitap>
          {
               
new Kitap{KitapId=1, KitapAdi="Suc ve Ceza"},
               
new Kitap{KitapId=2, KitapAdi="Savas ve Baris"},
               
new Kitap{KitapId=3, KitapAdi="Dirilis"},
               
new Kitap{KitapId=4, KitapAdi="Sinekli Bakkal"},
               
new Kitap{KitapId=5, KitapAdi="Calikusu"}
          };
          
List<Siparis>KitapSiparis = new List<Siparis>
          {
               
new Siparis{SiparisId=1, KitapId=1, OdemeSekli="Cek"},
               
new Siparis{SiparisId=2, KitapId=5, OdemeSekli="Kredi"},
               
new Siparis{SiparisId=3, KitapId=1, OdemeSekli="Nakit"},
               
new Siparis{SiparisId=4, KitapId=3, OdemeSekli="Cek"},
               new
 Siparis{SiparisId=5, KitapId=3, OdemeSekli="Cek"},
               
new Siparis{SiparisId=6, KitapId=4, OdemeSekli="Nakit"}
          };
          
var KitapSiparisler = from kt in KitapList
                                         
join spr in KitapSiparis
                                         on
 kt.KitapId equals spr.KitapId
           select new
          {
               kt.KitapId,
               spr.SiparisId,
               kt.KitapAdi,
               spr.OdemeSekli
          };
          
foreach (var item in KitapSiparisler)
          
Console.WriteLine(item);
     }
}
public class Kitap
{
     
public int KitapId { getset; }
     
public string KitapAdi { getset; }
}
public class Siparis
{
     
public int SiparisId { getset; }
     public
 int KitapId { getset; }
     public
 string OdemeSekli { getset; }
}
}