|
Yazan
|
Konu: MySQL tablo tasarım, sadece fikrinizi belirtiniz!!! (Okunma Sayısı 362 defa)
|
cem dermen
Yeni Kullanıcılar
Offline
Mesaj Sayısı: 45
|
+---+---+-------+---------+---------+-----+---------------------+-- no ad soyad email ülke tel bölüm +---+---+-------+---------+---------+-----+---------------------+ 1 a d @ fizik,kimya 2 b c @ kimya 3 g j fizik 4 h k bilgisyar 5 w ş linux, fizik, kimya 6 k m linux, science, software, computational, data mining, system programming . . . .. .. ... ... ......
bu şekilde bir veri tabanı planladım,
bölüm kısmında fizik , kimya, biyoloji, sosya bilimler, bilgisayar bilimleri , yapay zeka, işletim sistemleri yaklaşik 150-200 tane farklı bölüm olacak..
kişileri bu bölümlere göre ayrı ayrı sayfalarda sıralayacağim..
mesela fizik sayfasına girince a ,g ve w kullanıcılarının gerekli bilgileri çıkacak,
mysql> select bölüm from tablo_ismi where bolum=’fizik’; böyle bir aratma methodu uygulayacağim...ve fizik.php sayfasında verileri alacağim...
mysql> select bölüm from tablo_ismi where bolum=’computational’; böyle bir aratma methodu uygulayacağim...ve computational.php sayfasında verileri alacağim...
tabi bir kişi 100 tane bölümede üye olabilir...
bu veritabanına sadece sil, ekle, güncelle gibi fonksiyonları kullanacağim...
sizce bu şekilde bir çalişma prensibi mantıklımı? bu şekilde bir veri tabanı sistemi mantıklı mı? ya da daha değişik bir methodta denenebilir mi?
yardımlarınız için şimdiden teşekkur ederim
|
|
|
|
|
Logged
|
|
|
|
tayfun_de
PHP Öğrencisi
Offline
Mesaj Sayısı: 104
|
merhaba,
bence kaydedilecek bilgileri ayri tablolarda tutarsan, yapilacak islemler daha kolay olur.
t_user_subject tablosunda user ile ilgili bölümlerin kaydedilmesinde mysql REPLACE INTO komutunu kullanarak islemleri daha da kolay yürütebilirsin ( INSERT ve UPDATE i kullanmadan)
selam
tayfun
CREATE TABLE `t_user` ( `user_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `first_name` VARCHAR( 40 ) NOT NULL , `last_name` VARCHAR( 40 ) NOT NULL , `email` VARCHAR( 128 ) NOT NULL , `country` VARCHAR( 128 ) NOT NULL , `phone` VARCHAR( 30 ) NOT NULL ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> describe t_user; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | user_id | int(11) | NO | PRI | NULL | auto_increment | | first_name | varchar(40) | NO | | | | | last_name | varchar(40) | NO | | | | | email | varchar(128) | NO | | | | | country | varchar(128) | NO | | | | | phone | varchar(30) | NO | | | | +------------+--------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec)
CREATE TABLE `t_subjects` ( `subject_id` SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY , `description` VARCHAR( 128 ) NOT NULL ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> describe t_subjects; +-------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+----------------+ | subject_id | smallint(6) | NO | PRI | NULL | auto_increment | | description | varchar(128) | NO | | | | +-------------+--------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec)
CREATE TABLE `t_user_subject` ( `user_id` INT NOT NULL , `subject_id` SMALLINT NOT NULL , PRIMARY KEY ( `user_id` , `subject_id` ) ) ENGINE = MYISAM ;
mysql> describe t_user_subject; +------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------+ | user_id | int(11) | NO | PRI | | | | subject_id | smallint(6) | NO | PRI | | | +------------+-------------+------+-----+---------+-------+ 2 rows in set (0.01 sec)
|
|
|
|
|
Logged
|
|
|
|
cem dermen
Yeni Kullanıcılar
Offline
Mesaj Sayısı: 45
|
CREATE TABLE `t_user` ( `user_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `first_name` VARCHAR( 40 ) NOT NULL , `last_name` VARCHAR( 40 ) NOT NULL , `email` VARCHAR( 128 ) NOT NULL , `country` VARCHAR( 128 ) NOT NULL , `phone` VARCHAR( 30 ) NOT NULL ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE `t_subjects` ( `dep_id` SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY , `department` TEXT ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
ilk tabloyu phpmyadmin ya da mysql çaliştimaya kalktığımda 8. satırda ' ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci ' hatası veriyor neden olabilir? ?? Apache(1.3.23), MySQL(3.23.48) and PHP(4.1.1) bunları kullanoyorum acaba versiyonlarda mı sorun var?
|
|
|
|
|
Logged
|
|
|
|
|
kazaan
|
Bence iki tablo kullan birincisinde no ad soyad email ülke tel olsun ikinci tablondada no bolum olsun islemlerin daha kolaylasır gibime geliyor, yani bir sutunda 100 tane bolum secmis biri varsa bunu LIKE kullanarak aratabilirsin, veya benim dedigim gibi iki tablo kurarsın,no ya gore bolum atarsın mesala bir kisi hem fizik, hem matematik secti nosuda 5 o zaman ikinci tabloya 5 matematik 5 fizik diye verilerini girersin aratmada daha kolaylasır kodlarında daha hızlı calısır.
|
|
|
|
|
Logged
|
|
|
|
|
GaziMarşı
|
En mantıklısı 3 tablo kullanmak. 1.tablo kişi bilgilerini barındırmalı, 2.tablo bölüm bilgilerini barındırmalı, 3.tablo ise bu iki tabloyu ilişkilendirmeli...
Çünkü bir kişinin profilinde birden fazla bölüm olabilir. 3.tablo sayesinde daha esnek çalışabilirsin.
Veritabanı tasarlarken her ayrı tür veriyi ayrı tablolarda tutmak en mantıklısı ve geliştirmeye açık olanı...
|
|
|
|
|
Logged
|
|
|
|
nercan
Yeni Kullanıcılar
Offline
Mesaj Sayısı: 9
|
Bence 2 adet tablon olsun birinde kişi bilgilerini diğerinde bölümlerin bilgilerini oluştur... bunlar static tablolar. Bunların yanında bir de dinamic tablon olsun buda atıyorum kisibolum olsun... Kisi tablosu ID-ADI-SOYADI.......... Bolum Tablosu ID-BOLUMADI........ KisiBolum Tablosu ID-KISI_ID-BOLUM_ID-AKTIF..... Böyle bir durumda yani bir kullanıcı açıldığında Kisibolum tablosuna bolum tablosundaki kayıt kadar kayıt oluşturmalısın ve o kişi için bölümleri seçtikçe ilgili kaydın aktif alanını true yaparsın.. Aynı şey yeni bir bölüm girildiğinde de söz konusu olur.... Aynı mantıkla çok fazla kisi ve kullanıcım olacak diyorsan veri tabanını şişirmemek için kişiye bolum seçildiğinde kisibolum tablosuna bir kayıt oluturusun... Anlattıklarımı aşağıda özetleyeme çalışayım... 1.Yol: Eğer iki tablonun çarpımı kisixbolum(1000x100)100000 den daha az bir değer olacaksa bu yolu kullanmanı tavsiye ederim... Kisi Tablosu ID - ADI - SOYADI 1 DENEME TEST 2 DENEME2 TEST2 Bolum TAblosu ID - ADI 1 FİZİK 2 KİMYA KisiBolum Tablosu(Deneme kişisinin sadece fizik deneme2 kişisinin de fizik ve kimya aldığını düşünerek yazıyorum) ID - KISI_ID - BOLUM_ID - AKTIF 1 1 1 true 2 1 2 false 3 2 1 true 4 2 2 true yukarıdaki bilgilerle 2.yol(çok kayıt varsa bunu kullanmanı tavsiye ederim) ID - KISI_ID - BOLUM_ID - AKTIF 1 1 1 true 2 2 1 true 3 2 2 true bence böyle bir sistem senin işini görebilir. Ben fazla mysql kullanmadım ama ben oracle da genelde 1.yol u kullanıyorum.. bunları görüntülemen için sql kodu select k.adı,k.soyadı,b.adı from kisi k ,bolum b,kisibolum bk where bk.kisi_id=k.id and bk.bolum_id=b.id [and k.id=:kid]opsiyonel [and b.id=:bid]opsiyonel
|
|
|
|
« Son Düzenleme: 11, 2008, 05:04:38 am Gönderen: nercan »
|
Logged
|
Eğer yazılımcı olmak istiyorsan bilgisayara yapamayacağın hiç birşey olmamalı...
|
|
|
|
 |