[ stdlib.h @ 19.02.2004. 21:09 ] @
Dvoumim se da li da postujem u PHP ili mySQL forum, tako da je možda najbolje da temu smestim u Čekaonicu, ne sumnjam da će je već neko prebaciti gde treba...

Dakle, imam tabelu u kojoj čuvam sve informacije o domenima i koja u sebi sadrži sledeće atribute:

CREATE TABLE `domains` (
`id` integer NOT NULL auto_increment PRIMARY KEY,
`domain_name` varchar(50),
`domain_type` varchar(20),
`admin_first` varchar(25),
`admin_last` varchar(25),
`admin_address` varchar(60),
`admin_phone` varchar(40),
`admin_email` varchar(40),
`tech_first` varchar(25),
`tech_last` varchar(25),
`tech_address` varchar(60),
`tech_phone` varchar(40),
`tech_email` varchar(40),
`date_reg` date,
`date_exp` date,
`registrar` varchar(50),
`main_ip` varchar(60),
`sec_ip` varchar(60),
`main_name` varchar(60),
`sec_name` varchar(60),
`host` varchar(60),
`user` varchar(35),
`pass` varchar(35),
`date_pur` date,
`price_pur` DECIMAL(9,2),
`date_sold` date,
`price_sold` DECIMAL(9,2),
`sold_who` varchar(60),
`date_offers` date,
`price_offers` DECIMAL(9,2),
`offers_who` varchar(60),
`notes` TEXT,
`category` varchar(30)
);

ono sto treba da uradim je da ih preraspodelim, da svaka grupa atributa bude u zasebnoj tabeli (ne pitajte me zasto!) poput ovoga:

TABLE 'domain'
`domain_name` varchar(50) default NULL,
`domain_type` varchar(20) default NULL,

TABLE 'admin_contact'
`admin_first` varchar(25) default NULL,
`admin_last` varchar(25) default NULL,
`admin_address` varchar(60) default NULL,
`admin_phone` varchar(40) default NULL,
`admin_email` varchar(40) default NULL,

TABLE 'tech_contact'
`tech_first` varchar(25) default NULL,
`tech_last` varchar(25) default NULL,
`tech_address` varchar(60) default NULL,
`tech_phone` varchar(40) default NULL,
`tech_email` varchar(40) default NULL,

TABLE 'date'
`date_reg` date default NULL,
`date_exp` date default NULL,

TABLE 'location'
`registrar` varchar(50) default NULL,
`main_ip` varchar(60) default NULL,
`sec_ip` varchar(60) default NULL,
`main_name` varchar(60) default NULL,
`sec_name` varchar(60) default NULL,

TABLE 'access'
`host` varchar(60) default NULL,
`user` varchar(35) default NULL,
`pass` varchar(35) default NULL,

TABLE 'money'
`date_pur` date default NULL,
`price_pur` decimal(9,2) default NULL,
`date_sold` date default NULL,
`price_sold` decimal(9,2) default NULL,
`sold_who` varchar(60) default NULL,
`date_offers` date default NULL,
`price_offers` decimal(9,2) default NULL,
`offers_who` varchar(60) default NULL,

TABLE 'category'
`category` varchar(30) default NULL,

TABLE 'notes'
`notes` text

(atributi i sintaksa su nebitni, bitno je da skapirate o čemu pričam) - ono što me zanima je na koji način je najlakše da to odradim, bez potrebe da celu aplikaciju modifikujem iz korena - npr. stvari poput unosa iz forme, koji su do sada isli principom

Code:
$conn=mysql_connect("localhost", "stdlib", "stdin");

if (!$conn) die ("Could not connect to database.");

mysql_select_db("stdlib_domains",$conn) or die ("Could not open database."); 

$query = "INSERT INTO `domains` (`domain_name`,`domain_type`,`admin_first`,`admin_last`,`admin_address`,
`admin_phone`,`admin_email`,`tech_first`,`tech_last`,`tech_address`,
`tech_phone`,`tech_email`,`date_reg`,`date_exp`,`registrar`,`main_ip`,
`sec_ip`,`main_name`,`sec_name`,`host`,`user`,`pass`,`date_pur`,
`price_pur`,`date_sold`,`price_sold`,
`sold_who`,`date_offers`,`price_offers`,`offers_who`,`notes`,
`category`) VALUES('$domain_name','$domaintype','$admin_first','$admin_last','$admin_address',
'$admin_phone','$admin_email','$tech_first','$tech_last','$tech_address',
'$tech_phone','$tech_email','$date_reg','$date_exp','$registrar','$main_ip',
'$sec_ip','$main_name','$sec_name','$host','$user','$pass','$date_pur','$price_pur',
'$date_sold','$price_sold',
'$sold_who','$date_offers','$price_offers','$offers_who','$notes','$category')";

$result=mysql_query($query);
mysql_close();


pretpostavljam da će zahtevati izvršavanje devet kverija, za svaku tabelu po jedan (?), međutim, ne znam šta da radim sa stvarima poput listanja svih atributa iz svih tabela, što je bilo prilično jednostavno s jednim kverijem poput

Code:
$querylist= "SELECT * FROM domains order by `domain_name`";


Da li postoji jednostavnije rešenje u odnosu na to da posle "seckanja" tabele na više njih moram da koristim relacije i da ih izpovezujem, jer em što nikada nisam radio sa relacijama u mySQL-u tj. da budem iskren, nikada nisam izlistavao/manipulisao zapisima iz više, a kamoli devet tabela, em što mislim da ću da poludim sa silnim integritetima koje treba da održim u tih devet relacija - jel postoji neki lakši način ili moram celu aplikaciju da pišem ispočetka, uzimajući u obzir integritete svih ovih entiteta i koristeći prirodno spajanje tabela? Ako nema 'leba bez relacija, sugestija kako najbolje da ih ispovezujem (preko čega? id-a?) da bih mogao najlakše da ih listam/editujem/ubacujem podatke u sve ove tabele uz neki PHP/SQL kod kako to da izvedem (prevashodno kreiranje relacije + listanje svih zapisa iz svih tabela, ostalo [add/delete/modify] ne bi trebalo da bude problem, ako se svodi na izvršavanje devet INSERT into tabela1...tabela9 VALUES .../DELETE ... where id=$id/UPDATE ... where id=$id kverija, za svaku tabelu pojedinačno) bi mi više nego dobro došla!

Pozdrav!
[ stdlib.h @ 19.02.2004. 21:46 ] @
Znao sam da ću da zaglavim ovde, ubiše me ovi silni kveriji :)
[ _owl_ @ 19.02.2004. 23:32 ] @
Kada vec razbijas tabelu na vise projekcija (podtabela) bilo bi zgodno
da u svakoj imas i primarni kljuc (cisto da bi posle mogao da ih spajas
po toj koloni).
Za insert/update/delete bi bilo najbolje da koristis transakcije (vidi da li
tvoja verzija MySQL-a ima podrsku za njih).
Ne bi bilo zgore da pogledas sintaksu za JOIN.
[ noviKorisnik @ 20.02.2004. 08:35 ] @
Pogledaj recimo sledeći detalj
Citat:
TABLE 'admin_contact'
`admin_first` varchar(25) default NULL,
`admin_last` varchar(25) default NULL,
`admin_address` varchar(60) default NULL,
`admin_phone` varchar(40) default NULL,
`admin_email` varchar(40) default NULL,

TABLE 'tech_contact'
`tech_first` varchar(25) default NULL,
`tech_last` varchar(25) default NULL,
`tech_address` varchar(60) default NULL,
`tech_phone` varchar(40) default NULL,
`tech_email` varchar(40) default NULL,

Obe tabele imaju identičnu strukturu a razlikuju se samo po prefiksu naziva polja.

Ja bih, na primer, napravio samo jednu tabelu bez prefiksa. Naravno, fali ključ, pa bi postojalo i polje "id" - autoinkrementirajući intedžer i primarni ključ.

U tabeli "domain" (podaci o domenu) mora da postoje podaci o administrativnom i tehničkom kontaktu - a to su u stvari podaci iz tabele "contact". Ako se u tabelu "domain" doda polje "admin_contact" u kome bi se čuvala vrednost "id" polja tabele "contact" - lako se može doći i do ostalih podataka o kontaktu.

Pravljenje i obrada formulara sa desetinama polja je nezahvalan posao i - pogrešan.

Recimo da je za neki domen ista osoba i administrativni i tehnički kontakt... ili da je ista osoba kontakt za više od jednog domena... To znači da se više puta unose isti podaci - dolazi do dupliranja.
To takođe znači da se greška pri unosu podataka ne može lako otkriti:
- pred nama stoji Pera i tvrdi da ima 10 domena i da je ostvario pravo na popust a mi upitom za koliko domena je odgovoran "Pera Mali" i dobijamo rezultat 9 (pri jednom unosu je greškom uneto "Pera Mail")...
Izmena podataka o nekoj osobi je komplikovano:
- imaš vrednu devojku koja je odgovorna za više desetina domena i ona se udaje i menja prezime...

Rešenje ovoga je da se svaki kontakt unosi samo jednom u bazu i onda se lako rade ispravke grešaka i eventualne izmene podataka.