Hey Veri! Tabanları Yağlamaya Devam 1
Merkej taban yağlamaya devam edijem, ekipmana ihtiyajım var!
Anlaşıdı, tamam! Zeytin yağı kapsülü yolda!
Allah şenden rajı olsun merkej!
Kes yağ çekmeyi işine bak!
E, iyi de zaten benim işim yağlamak Merkejjiim
Ula seni işe laf yapasın diye almadık!
E, şey, kem küm… Anlaşıldı, tamam!
Zeytin yağı yolda, o zaman tereyağıyla yağlayalım!
Doktor amcamız, karşı sokaktaki özel muayenehanesi için bizden bir program istiyor. Bilgisayarı yeni almış ve Personelin oyun oynaması için değil, hasta kayıtlarını tutmak için aldığını söylüyor. Tabi biz de cici bir tavırla amcamızı kırmadan kabul ediyoruz bu isteğini. O bizi geçen sefer kırmamış stajyer hemşirelik öğrencisiyle ile tanıştırmıştı…
Bir akşam yemeğinde dile getirdiği bu isteğini kabul ettik ama o bu projenin aslında bizi ne kadar uğraştıracağından, ne tür beyin fırtınalarına kurban edeceğinden haberdar değil.
Evet, amcamızla o akşam yemek ortamındaki muhabbeti bozmamak için konuyu kapatıp, ertesi gün görüşmek üzere randevulaştık. Her zamanki gibi randevularımıza zamanında gidip kalitemizden ödün vermedik. Elimizde yapacağımız işle ilgili kendimizce notları tutmak için not defterimiz, karşılıklı konuşuyoruz, aslında o konuşuyor biz dinliyoruz… Anlatıyor:
“Şimdi, bizim buraya bir sürü hasta gelir, biz hepsinin sağlık durumu takip etmek için kartotek sistemi kullanıyoruz, yani her hasta için bir kartımız var, bak bu kartımız:
-------------------------------------------------------------------------------
| Hasta Takip Kartı |
-------------------------------------------------------------------------------
| Adı Soyadı: | D. Tarihi: ../../.... |
-------------------------------------------------------------------------------
| Adresi: | Tel. No: |
-------------------------------------------------------------------------------
| Tarih | Bulgular | Tanı | Tedavi |
-------------------------------------------------------------------------------
| ../../.... | | | |
-------------------------------------------------------------------------------
| ../../.... | | | |
-------------------------------------------------------------------------------
| ../../.... | | | |
-------------------------------------------------------------------------------
| ../../.... | | | |
-------------------------------------------------------------------------------
| ../../.... | | | |
-------------------------------------------------------------------------------
| ../../.... | | | |
-------------------------------------------------------------------------------
| ../../.... | | | |
-------------------------------------------------------------------------------
| ../../.... | | | |
-------------------------------------------------------------------------------
| ../../.... | | | |
-------------------------------------------------------------------------------
| ../../.... | | | |
-------------------------------------------------------------------------------
| ../../.... | | | |
-------------------------------------------------------------------------------
Bazen, bu kart doluyor, bir yenisini açıyoruz… En büyük problemimiz, hasta geldiği zaman kartını bulamayınca yeni kart açıyoruz ki sonra işler Arap saçına dönüyor, bir de kartlar kaybolabiliyor falan… Bak işte böyle, bizi rahatlatacak bir program yap bize.
Cevabımız “Tamam, basit iş” oluyor. “Peki programı kim kullanacak?” diye sorduğumuzda, amcamız: “Ben kullanacağım, bilgisayar muayenehanede duracak, hasta gelince hemen kartını açayım bakayım. Bir arkadaşım Word’de herkese bir dosya açmış, ama ne biliyim benim hoşuma gitmedi o, yani ne bu daktilo değil, teknoloji diye bir sürü para yatırdık, öyle yapacağıma daktilo koyarım buraya onu kullanırım.” diye konuşurken o, biz de gülümseyerekten dinlemeye devam ediyoruz… Devam ediyor: “Bir arkadaşım daha var, gerçi bir sürü arkadaşım var, bir ara mangal partisine gitmiştik…” of be amca off… “…Ha ne diyordum? Ha tamam… Bak bir arkadaşım hesap tablosu mudur nedir onda yap dedi, hem programa m-rograma da para mara vermezsin her ihtiyacını görür dedi. Ne oluyor bu hesap tablosu?” Bu amcalar hep böyledir işte… Anlatıyoruz ne olduğunu hesap tablosunun ve o da anlıyor istediğinin hesap tablosu olmadığını. “Neyse sen hadi yap şu programı, yarın biter mi?” diyince ekşi bir sırıtışla “En az, en az bir hafta sürer amca!” diyoruz ki bu temkinli bir süre, işimiz basit belki ama n’olur n’olmaz bu programlama işlerinde bir takılıyorsunki bir noktaya pir takılıveriyorsun değil mi?..
Bu güzel sohbetimizden sonra biraz daha inceliyoruz ortamı “ne yaparlar ne ederler burada” diye. Hastaların önemli bilgileri nelerdir inceliyoruz. Ardından dönüyoruz eve, masamızı boşaltıyoruz… Kağıtlar, kalemler vs. tüm ihtiyaç duyduğumuz şeyleri toparlıyoruz, 5-10 saatlik yiyecek – içecek stoğumuzu da yapıyoruz, çünkü az sonra beynimiz yerinde durmayacak tüm ihtimalleri tüm ilişkileri denetleyecek ve en optimizm veri yapısını çıkartacak. Başlıyoruz düşünmeye:
(Tabi ben epeeeeyce kısaltıyorum bu düşünce olayını…)
Hasta kartında şunlar var:
-Adı
-Soyadı
-Doğum tarihi
-Telefon numarası
-Adresi
-1. muayene için tarih, bulgu, tanı, tedavi
-2. muayene için tarih, bulgu, tanı, tedavi
-3. muayene için tarih, bulgu, tanı, tedavi
-4. muayene için tarih, bulgu, tanı, tedavi
-...
*Bütün işi tek bir tabloyla halledeyim:
Tablo: HastaTakip:
-Alan01: Adi
-Alan02: Soyadi
-Alan03: D_Tar
-Alan04: Tel_No
-Alan05: Adres
-Alan06: Tarih1
-Alan07: Bulgu1
-Alan08: Tani1
-Alan09: Tedavi1
-Alan10: Tarih2
-Alan11: Bulgu2
-Alan12: Tani2
-Alan13: Tedavi2
-…
-Alan62: Tarih20
-Alan63: Bulgu20
-Alan64: Tani20
-Alan65: Tedavi20
*Nasıl fikir?
*Hiç fena değil!
*Basit
*Kestirme çözüm
*Mantıklı, aynı kartotek gibi oldu
*Neeeeeeee! Aynı kartotek gibi mi oldu?
*Hayır olmamalı! Ne anlamı kalır o zaman?
*Bir hasta 20 defadan fazla gelince n’olcek?
*N’olsun yeni bir kayıt açılcek.
*O zaman nasıl görecek aynı kişinin kayıtlarını?
*E, o zaman isim sıralı çağırırız, sonra da bakar düşünür…
*Olur mu öyle şey! Hem hasta sayısı artınca ne olacak?
*Evet, evet! tam bir rezalet!!! 100 kayıt olunca birisini aramak rezalet olacak!!!!
*Peki ya Aspirin verdiği hastaları nasıl bulacak? 20 tane tedavi bölümüne mi bakacak?
*Yok, yok olmaz!!! Böyle olmamalı…
*Nasıl olmalı???
*Bilmem ki?
*Kötü Fikirmiş!!!!!!!!!
*Statik bir veri yapısı kullanmamak lazım.
*O zaman dinamik?? Hm…
*Hastaların bilgileri hep sabit. Hastaların özel bilgilerini ayrı tutayım,
*Ne vardı kartotekte? Adı, soyadı, doğum tarihi, telefon numarası, adresi.
*Başka ne lazım olabilir? Her hastada sabit olabilecek başka ne olabilir? Yani başka bir tabloya ayırmaya ihtiyaç duymayacağım başka ne olabilir? KAN GRUBU!!! Evet kan grubu, her hastada sabit! Başka da yok…
*Hastalar tamam, bu tarihler, bulgular falan hep aynı tip bilgiler, bunları ayrı bir tablo yapayım bari
*Şimdi hastanın muayeneye geliş tarihi var, bulgular var, konulan tanı var ve uygulanan tedavi var, başka ne var? Yok…
*Evet daha nasıl dinamikleştirebilirim ki?
*Hastalara konan tanılar aynı, yani ya nezle’nin Latincesini yazıyorlar, ya gribinkini, ya da
herhangi birininkini işte…
*O zaman tanıları önceden kaydedersem bu da dinamikleşmiş olur değil mi? Evet!
*Böylece grip tanısı koyduğu hastaları çat diye bulabilecek. Ne güzel…
*Bir de doktora yardımcı olsun diye, konacak tanı için olası bulguları ve olası tedavileri de
belirtsek fena olmaz.
*Ha, bir de tanıyla ilgili özel bir ayrıntı varsa bunu da muayene kaydında belirtmek lazım…
Bu uzun uzadıya düşüncemiz tatlı meyvesini vermiş oldu. Tablolarımızı belirledik, alanlarımızı belirledik, bir de ilişkilerimizi belirledik. Ama alan tiplerimizi belirlemedik ki! Onu da şöylecene tamamlayıp veri yapımızın son halini görmenin zamanı geldi, değil mi?

Şşşşşt! Zeytin yağı kapsülü geldi! Tam gaz yağlama zamanı!
“Bu tabloyu SQL ile nasıl yaratırız kardeşim???” E, daha önce anlattım ama hadi kırmayım sizi yine anlatayım…
CREATE DATABASE muayenehane;
USE muayenehane;
CREATE TABLE hastalar(no INT (6) UNSIGNED NOT NULL AUTO_INCREMENT, soyad CHAR(30) NOT NULL, ad CHAR(30) NOT NULL, d_tarihi DATE, kan_grubu SET(A+,A-,B+,B-,AB+,AB-,0+,0-), adres TEXT, tel_no VARCHAR(11), PRIMARY KEY(no), INDEX(no,soyad,ad));
CREATE TABLE muayeneler(no INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, hasta_no NT(6) NOT NULL, tarih DATE, bulgular TEXT, tani INT(6), tani_not TEXT, tedavi TEXT, PRIMARY KEY(no), INDEX(no,tarih,tani));
CREATE TABLE hastalar(no INT (6) UNSIGNED NOT NULL AUTO_INCREMENT, ad CHAR(30) NOT NULL, olasi_bulgular TEXT, olasi_tani TEXT, PRIMARY KEY(no), INDEX(no,ad));
Anlamadınız mı??? CREATE hakkında ayrıntı için ilk dersi bir daha yağlayın!!!!
Bütün işlemlerin merkezi muayeneler tablosu, bütün yağlama burda. Biz bu yağlamaya hareket diyoruz. Yani her şey muayeneler tablosu etrafında dönüyor. Bir muayene bilgisinin kime ait olduğunu tablodaki hasta_no alanından öğreniyoruz. Bu alan hastalar tablosundaki ilgili hastanın no alanına bağlı, ki bu alan auto increment (her kayıt eklendiğinde değeri otomatik artan alan, bir nevî kayıt no) ve primary key (her bir kayıtta ayrı değere sahip ve belirteç görevi gören anahtar alan) özelliklerine sahip, böylece her hastanın no’su farklı oluyor ve hastayı böyle belirliyoruz. Bir muayene kaydında konan tanının ne olduğunu da tani alanından öğreniyoruz ki bu da tanilar tablosundaki no’ya bağlı. Bütün tablolarda birer primary key ve auto increment özelliğinde alan var, ayrıca bazı indexli (bunun ne olduğunu ilk derste anlatmıştım) alanlar da var. Bu indexli alanlar gerekli hallerde arama yapmamızı kolaylaştıracak. Mesela “Grip” tanısı konan bir hastayı bulmak istersek yapacağımız şey şu basamakları içeriyor:
tanilar tablosunda ad alanında, "Grip" değerini ara, no'sunu(x) al;
muayeneler tablosunda tani alanında, tanilardan bulduğumuz no'yu(x'i) ara hasta_no'yu(y) al;
hastalar tablosunda no alanında, muayenelerden bulduğumuz hasta_no'yu(y'yi) ara.
Yağlanmış hali nasıl peki, yani SQLcesi??
select * from hastalar, muayeneler, tanilar where tani.ad="Grip" and muayeneler.tani=tani.no and hastalar.no=muayeneler.hasta_no
Görüyorsunuz bunun SQL’cesi tek satır.
Ne o muayene.tani’ymış tani.no’ymuş felan!!! Anlamam kardeşim ben böyle şeylerden. Gelmeyin üstüme böyle yağlarla!.. dediğinizi duyar gibiyim. Dikkatinizi çektiyse from‘dan sonra “,” (virgül) ile ayılmış 3 ayrı ifade var. Bir yerden gözüm ısırıyor ama nereden… Aha! Bunlar bizim tablolar yahu… Evet bildiniz! 3 tabloyu aynı anda kullanıyoruz. Sonra da önceden tanıştığımız sevgili dostumuz where ile bu 3 tablodaki kayıtlarda eleme yapıyoruz. Şimdi bir bakalım tani.ad ne anlam ifade ediyor? Uzatmadan söylüyorum. Tanıların bulunduğu tani tablosundaki tanının adını belirlen ad alanını ifade ediyor. Yani where’de kulladığımız ilk ifadenin Türkçesi şöyle: “tanı tablosundakilerden tanı adı Grip olan”. Sonra bağlaç ve mantık kapısı diye değişik görevler üstlenen bir ifade geliyor peşinden and. Hemen peşinden de muayeneler.tani ve tani.no geliyor, Türkçesiyle “muayene tablosundakilerden tanısı (yani tanı nosu), tanı tablosundaki tanı nosu olan -ki bu da önceki koşula uyanlardan biriyse yani tanı adı Grip ise-“ demek oluyor. Son ifade de aynen şöyle Türkçeleştirilebilir : “hastalar tablosundakilerden hasta no’su, muayene tablosundaki hasta no olan -ki bu da önceki 2 koşula uyanlardan biriyse yani tanı adı Grip ve muayene tanının konduğu muayene ise
E, peki diyelim ki “Mehmet Aca”nın muayenelerini kayıtlarını arayacağız… N’apmamız lazım?
select * from hastalar, muayeneler, tanilar where muayeneler.hasta_no=hastalar.no and tanilar.no=muayeneler.tani and hastalar.ad="Mehmet" and hastalar.soyad="Aca"
Evet bu da böyle. Bir önceki örnekte de dikkatinizi çekmiştir bir tabloda arama yaparken, diğer tabloları da ilişkilerine göre (bkz : Veri Yapımız) koşullandırıyoruz. Böylece işimiz hallolmuş oluyor…
İstediğimiz hasta kaydını bulduk. Nasıl basit ve dinamik ha? Bu arada bazı Veri Tabanı Yönetim Sistemleri tablolarınızı bağıl tanımlayınca otomatik olarak ilişkileri kuruyorlar. Her ne kadar avantaj sağlasa da, bir o kadar dezavantaj sağlıyor. Ben önermiyorum…
Eveeet! Bu derste neler yağladık neler? Zeytinyağlı köfteler, tereyağlı pilavlar… Of da ne of…
Merkej yağım bitti! Yağ gönder!
Tamam, depoya bakıp geliyorum
Merkej acele et, zuxaylılar geliyooo merkej!
Merkeeeejjjjj!!!! Alooo meeeeeeeeerkeeeeeeeeeeeeeeeeeejjjj!!!!!!!!
Meerkeeeej imdaaaaaaaaaat!!!
>HAŞUUURRRRTTTTT (<---zuxaylılar bir yağcımızı daha yiyorlar)
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!!!!
Yağcı!
Şşşşt yağcı!
Ula cevap versene!
>dididididiiiiiiit dididididiiiiiiit... (<---telefon çalıyor)
>klik (<---telefonu açıyor)
Efendim?
>vıdıvıdıvıdıvıdı da vıdıvıdıvıdıvıdıvıdıvıdı (<---aha karısı!)
Tamam karıcıım, mesai bitti hemen geliyom.
>vıdıvıdıvıdı vıdı vıdıvdıdı
Peki karıcıım, 2 ekmek, 5 yumurta alıyorum gelirken, başka?
>vıdıvıdıvıdı...
Tamam, hadi öptüm...
N. Can KIRIK
Bilgisayar Mühendisi / Tasarımcı












Android’te Grafik Kaynakları-2 : View Nesnelerine Hareket Kazandırmak
Android’te Grafik Kaynakları-2 : View Nesnelerine Hareket Kazandırmak
IBM Yazılım Akademisi 2011
C#’a GENEL BAKIŞ
Kullanıcı Tahminli Sayı Tahmin Oyunu