[ corelko @ 06.09.2011. 13:57 ] @
Imam par pitanja vezano za normalizaciju baze podataka. Ako imam neke kategorije i proizvode, mozda je najbolje uzeti primer prodavnicu racunara, i recimo da je veza izmedju kategorija i proizvoda 1:N tj jedan proizvod ne moze da pripada u vise kategorija (Tastatura ne moze da pripada i tastaturama i procesorima). Kako god okrenem dodje do dupliranja podataka, recimo:

Code:
Proizvodi (id_proizvoda, naziv, id_kategorije)
Kategorije (id_kategorije, naziv)



Ako bi iskoristio 2NF onda dodje do narusavanja veze 1:N

Code:
Proizvodi (id_proizvoda, naziv)
Kategorije (id_kategorije, naziv)
Proizvodi_Kategorije (id_proizvoda, id_kategorije)


Kako bi uopste obezbedio popunjavanje ove tabele Proizvodi_Kategorije ?!?
[ bogdan.kecman @ 06.09.2011. 14:35 ] @
Citat:
corelko: mozda je najbolje uzeti primer prodavnicu racunara, i recimo da je veza izmedju kategorija i proizvoda 1:N tj jedan proizvod ne moze da pripada u vise kategorija (Tastatura ne moze da pripada i tastaturama i procesorima). Kako god okrenem dodje do dupliranja podataka


kreces iz greske :)

prodavnica racunara je odlican primer gde jedan prodajni artikal *moze* da pripada u vise od jedne kategorije. To sto vecina prodavnica mora da uglavi artikal u samo jednu kategoriju je zbog limita njihovog software-a a ne zbog toga sto tastatura ne moze da bude vise kategorija (sta cemo sa kitovima gde ide npr wireless tastatura, mis, touch screen i daljinski, u koju kategoriju to ide? misevi? tastature? daljinski uredjaji? oprema? .. ili sa graficka + tv karta integrisano ili gomila slicnih primera .. poceli su da dele fotoaparate uz stampace, 1 artikl == 1 kategorija u racunarskom svetu nece da radi posao).

dalje, koji je razlog limitiranja, sve i da imamo prodavnicu obuce koja ima kategorije "muske cipele", "zenske cipele", zasto ih limitirati? Mozda imaju i neke unixex cizme, kakvo je vreme doslo sa ovim metro* vise ne moze normalan covek da razlikuje sta je za ove a sta za one .. sve je unisex...


Citat:

Code:
Proizvodi (id_proizvoda, naziv, id_kategorije)
Kategorije (id_kategorije, naziv)



Ako bi iskoristio 2NF onda dodje do narusavanja veze 1:N

Code:
Proizvodi (id_proizvoda, naziv)
Kategorije (id_kategorije, naziv)
Proizvodi_Kategorije (id_proizvoda, id_kategorije)


Kako bi uopste obezbedio popunjavanje ove tabele Proizvodi_Kategorije ?!?


ovo sto si napravio je kako to "generalno treba" dakle bez limita, jedan proizvod moze da bude u "koliko oces" kategorija. E sad, ako hoces limit onda id_kategorije sedi u tabeli proizvodi kao sto je u prvom delu pitanja, to nije denormalizovano stanje. To je model kada jedan proizvod moze da pripada samo jednoj kategoriji. Generalno ako u proizvodi_kategorije id_proizvoda bude PK onda si opet limitirao da proizvod moze da ima samo jednu kategoriju, mada je to normalizacija koja nema mnogo smisla u praxi, samo u teoriji.
[ corelko @ 07.09.2011. 16:33 ] @
Evo uvazavajuci primedbe ja sam nesto pokusao da izmodelujem. Valjda se sad jasno vide i strani kljucevi pa ne moram da objasnjavam koje sam gde veze koristio. Evo slika i mwb fajl modela:


http://www.slike.com/?v=E6OWa.png

http://www.sendspace.com/file/3aofj5





[ bogdan.kecman @ 07.09.2011. 22:41 ] @
konfiguracija - zasto kopiras u tu tabelu tip usera?
korisnik_narudzba - isto pitanje

ostalo je sve ok
[ corelko @ 07.09.2011. 23:00 ] @
Ja ga nisam kopirao, osobina veze je prevukla taj kljuc, iako je i meni bilo nelogicno nisam hteo namerno nista da diram.

Sutra cu se javiti za jos par saveta vezano za upite koje budem pravio. Imam osecaj da cu tu nagrabusiti samo tako .
[ bogdan.kecman @ 07.09.2011. 23:09 ] @
da , zato sto si bacio tip u PK, izbaci tip iz PK-a, nema potrebe da sedi tamo
[ corelko @ 07.09.2011. 23:13 ] @
hvala to cu da prepravim !
[ corelko @ 08.09.2011. 13:44 ] @
Prepravio sam ovo vezano za tip korisnika:

http://www.slike.com/?v=Ib8ek.png


Nego nesto gledam ovaj model, tabela Konfiguracija nema spoljni kljuc iz Proizvodi, valjda bi trebala da ima jer konfiguracija se sastoji od odredjenih Proizvoda :)




[ bogdan.kecman @ 08.09.2011. 13:45 ] @
treba ti tabela "konfiguracija_proizvod"
[ corelko @ 08.09.2011. 13:59 ] @
znam i ja nesto xD

Konacno:
http://www.slike.com/?v=z98jP.png


[ biske86 @ 08.09.2011. 14:07 ] @
@corelko imam jedan predlog. A to je da bi lakse pratili diskusiju bolje bi bilo da slike ne stavljaš na neke spoljne sajtove, možeš direktno da ubaciš na forum. Na primer kad objaviš poruku, samo idi na dugme Upload uz poruku i onda ubaci sliku sa svog računara. Kad se slika uploaduje pojaviće ti se dva dugmeta, jedno da prikažeš umanjenu sliku (tzv. thumbnail) ili da ubaciš sliku u punoj veličini u svojoj poruci. Ovo je samo predlog, meni nekako lepše izgleda, ne moram da skačem sa sajta na sajt i ponovo da se vraćam, recimo čitam tvoj tekst i gledaš sliku na istom mestu. Ovo dugo nisam znao dok sam koristio ovaj forum ali je korisna stvar. Pozdrav.
[ corelko @ 08.09.2011. 14:24 ] @
Hvala na sugestiji, ubuduce cu to da radim. Iskren da budem, kako su te opcije na dnu, skontam ih tek nakon nekoliko postova i onda ajde rekoh da ne saram upload cu sve na isto mesto, al ok, lepse je kad je sve na jednom mestu.


Posto nisam mnogo puta koristio WorkBanch, uglavnom sam pravio jednostavne modele u PowerDesigner, vidim da i WB ima dosta dobru podrsku za generisanje SQL koda pa me zanimaju ova nekolika reda, tj kakvo je ovo ogranicenje 'fk_Korisnik_Tip' i sta mu ga dodje ovo na brisanju i apdejtu bez akcije?

Code:

 CONSTRAINT `fk_Korisnik_Tip`
    ON DELETE NO ACTION
    ON UPDATE NO ACTION


[ biske86 @ 08.09.2011. 14:47 ] @
Citat:
corelko:
Posto nisam mnogo puta koristio WorkBanch, uglavnom sam pravio jednostavne modele u PowerDesigner, vidim da i WB ima dosta dobru podrsku za generisanje SQL koda pa me zanimaju ova nekolika reda, tj kakvo je ovo ogranicenje 'fk_Korisnik_Tip' i sta mu ga dodje ovo na brisanju i apdejtu bez akcije?

Code:

 CONSTRAINT `fk_Korisnik_Tip`
    ON DELETE NO ACTION
    ON UPDATE NO ACTION


Radi se o referencijalnom integritetu. To kazuje DBMS-u šta da radi kada se dese DELETE i UPDATE nekog reda u tabeli Korisnik, pošto korisnik ima strani ključ Tip_IdTip. U tvom slučaju rekao si da kad se izbriše ključ Tip_IDTip recimo koji je jednak 1 onda ne bi trebalo da se briše red iz tabele Tip koji sadrži idTip=1.

O referencijalnom integritetu:
http://en.wikipedia.org/wiki/Referential_integrity
[ corelko @ 08.09.2011. 15:48 ] @
Jasno ko dan !

Jos nesto sto mi je zapelo za oko jesu ovi spoljni kljucevi. Znam da su jos na faxu praktikovali da se kolone koje cuvaju spoljne kljuceve preimenuju pa tako npr. spoljni kljucevi u tabeli Kategorija_Proizvod da se zovu samo 'kategorija' i 'proizvod' i da se ova duga imena elimisu, msm isto mu ga dodje, al eto.
Zanima me jos da li dobro za primarne kljuceve koristiti opciju auto_incremet ?
[ biske86 @ 08.09.2011. 16:29 ] @
Citat:
corelko:
Jos nesto sto mi je zapelo za oko jesu ovi spoljni kljucevi. Znam da su jos na faxu praktikovali da se kolone koje cuvaju spoljne kljuceve preimenuju pa tako npr. spoljni kljucevi u tabeli Kategorija_Proizvod da se zovu samo 'kategorija' i 'proizvod' i da se ova duga imena elimisu, msm isto mu ga dodje, al eto.

Ne znam kako drugi rade ali ja ih ne preimenujem. Recimo u tvom slučaju ne bih stavljao Tip_IdTip već bih stavio IdTip kako je i u originalnoj tabeli. Ovo i nije toliko važno, bitno da je tebi i tvom timu razumljivo, tj. napravite jednu konvenciju i toga se držite. Ako radiš neki open sors projekat na kome bi moglo dosta ljudi da radi onda bi trebalo da se držiš standardnih konvencija, nemoj da izmišljaš toplu vodu. Na primer, meni se u Javi sviđa što gde god da gledam tuđ kod programeri se drže jedne konvencije i to mi dosta olakšava čitanje tuđeg koda.
Citat:
corelko:Zanima me jos da li dobro za primarne kljuceve koristiti opciju auto_incremet ?

Pa to zavisi od slučaja ali generalno nema ništa loše koristiti ih. Jedino sam čuo od jednog iskusnog developera baze da je imao problema da očuva integritet kada mu je pukao access, i da on koristi AutoNumber samo ako želi nešto hitno da odradi u situacijama kada je nešto jednokratno a drugi već pomenuti razlog je da kad ga sam kreiraš onda lako možeš da ga kontrolišeš.
[ corelko @ 17.09.2011. 14:59 ] @
Evo posle krace pauze da ozivim temu. Poceo sam da pisem prve upite i odmah problemi. Napravio sam upit za registraciju korisnika i prilikom izvrsenja dobijam sledecu gresku:
Code:
a foreign key constraint fails


Citao sam o referencijalnom integritetu i dosao do zakljucka da u tabeli u kojoj imam spoljni kljuc ne sme da se pojavi nepostojeca vrednost na koju spoljni kljuc pokazuje. Ne znam da li sam se dobro izrazio, ali za primer u tabeli Korisnik imam spoljni kljuc Tip_idTip iz tabele Tip i prilikom registracije korisnika kroz upit unosim i taj Tip_idTip koji naravno postoji u tabeli Tip. E sad sto se tice ove greske moje misljenje je da se ovaj spoljni kljuc nije ni formirao kako treba. Evo postavljam kod koji je kreirao WB pa da prokomentarisemo:

Code:

CREATE TABLE IF NOT EXISTS `korisnik` (
  `idKorisnik` int(11) NOT NULL AUTO_INCREMENT,
  `ime` varchar(45) NOT NULL,
  `prezime` varchar(45) NOT NULL,
  `korisnicko_ime` varchar(45) NOT NULL,
  `sifra` varchar(32) NOT NULL,
  `email` varchar(45) NOT NULL,
  `adresa` varchar(45) NOT NULL,
  `telefon` varchar(45) NOT NULL,
  `Tip_idTip` int(11) NOT NULL,
  PRIMARY KEY (`idKorisnik`,`Tip_idTip`),
  KEY `fk_Korisnik_Tip` (`Tip_idTip`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `korisnik`
--


--
-- Constraints for dumped tables
--

--
-- Constraints for table `korisnik`
--
ALTER TABLE `korisnik`
  ADD CONSTRAINT `fk_Korisnik_Tip` FOREIGN KEY (`Tip_idTip`) REFERENCES `mydb`.`tip` (`idTip`) ON DELETE NO ACTION ON UPDATE NO ACTION;



Zar ovaj deo oko spoljneg kljuca nebi trebao da izgleda nesto ovako:

Code:
foreign key(tip_idTip) references Tip(idTip)
        on delete cascade
        on update cascade


Kod mene tip_idTip presao u FK?!?
[ biske86 @ 17.09.2011. 16:38 ] @
Probaj da postaviš konkretnije pitanje i kad nešto pitaš daj nam informacije da bi mogli da ti pomognemo. Ne može niko da gleda u pasulj da bi video kako tvoj upit izgleda ili kakvi su podaci u njima. Ajde samo se stavi u našu poziciju pa vidi. Postoji mnogo stvari koje mogu da budu pogrešne i što više informacija daš pre ćeš dobiti odgovor.
Znači daj taj upit koji pokušavaš da izvršiš i iskopiraj celu grešku koju taj upit proizvodi.
[ corelko @ 17.09.2011. 17:22 ] @
Evo upita koji izvrsavam u phpmyadmin-u

Code:

INSERT INTO korisnik (ime, prezime, korisnicko_ime, sifra, email, adresa, telefon, Tip_idTip) VALUES ('korisnik','korisnik','korisnik','716b64c0f6bad9ac405aab3f00958dd1','[email protected]','nebeskih plavetnila ','444444','2')


Evo poruke o gresci:
Code:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`prodavnica`.`korisnik`, CONSTRAINT `fk_Korisnik_Tip` FOREIGN KEY (`Tip_idTip`) REFERENCES `mydb`.`tip` (`idTip`) ON DELETE NO ACTION ON UPDATE NO ACTION)


Evo tabele Tip:

Code:

--
-- Table structure for table `tip`
--

CREATE TABLE IF NOT EXISTS `tip` (
  `idTip` int(11) NOT NULL,
  `tip_korisnika` varchar(10) NOT NULL,
  PRIMARY KEY (`idTip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `tip`
--

INSERT INTO `tip` (`idTip`, `tip_korisnika`) VALUES
(1, 'A'),
(2, 'K');


Evo kako sam to odradio u PHP-u
Code:

if($error==' ')
{
                        $ime=mysql_real_escape_string($_POST['ime']);
                        $prezime=mysql_real_escape_string($_POST['prezime']);
                        $nadimak=mysql_real_escape_string($_POST['nadimak']);
                        $sifra=md5($_POST['sifra']);
                        $email=mysql_real_escape_string($_POST['email']);
                        $telefon=mysql_real_escape_string($_POST['telefon']);
                        $adresa=mysql_real_escape_string($_POST['adresa']);
                        
                        
                        $unos = "INSERT INTO korisnik (ime, prezime, korisnicko_ime, sifra, email, adresa, telefon, Tip_idTip) 
                        VALUES ('".$ime."','".$prezime."','".$nadimak."','".$sifra."','".$email."','".$adresa."','".$telefon."','2')"; 
                        $dodajkorisnika = mysql_query($unos); 
                            if($dodajkorisnika)
                            {
                                $forma = "<h2>Uspesno ste se registrovali</h2><p>Možete se logovati i izvršiti narudžbu</a>.</p> ";
                                    
                            }
}
                    else 
                    {
                        echo "<font color=red size=4>Greška !</font><br> <ul>".$error."</ul> <p>";
                    }
                


Kako izgleda tabela Korisnik - to sam vec postavio u prethodnom postu.

Naravno ovo nije celi skript za registraciju jer nadam se da deo oko provere korisnickog imena, email-a, telefona nije bitan za ovaj problem koji se javlja. Jednostavno pokusavam da budem sto kraci i da ne pisem romane jer nije lako sve to citati.

Konkretno pitanje je sta ovde ne valja pa mi upis u tabelu Korisnik nije moguc ?
[ biske86 @ 17.09.2011. 17:38 ] @
Nisam siguran šta bi moglo da bude ali probaj da izbaciš Tip_idTip iz primarnog ključa, neka bude samo idKorisnik.

Još jedna stvar koja mi je čudna je to što koliko vidim tabela Korisnik je u bazi Prodavnica a tabela Tip je u bazi mydb. Zbog čega je to tako?

Jedan savet: mani se tog phpmyadmina i uzmi Workbench. Možeš ga naći na adresi http://wb.mysql.com

[ corelko @ 17.09.2011. 18:07 ] @
Pokusacu ovo pa se javljam.

A za tip ne znam zasto je to tako. Tacno je da ja imam bazu koja se zove mydb i koja ima sve ove kolone kao i prodavnica ali napominjem da mi je ovaj sql generisam workbench i onda sam ja napravio bazu prodavnica i u njoj izvrsio napravljeni sql kod i to je to. Moguce je sto ti kazes da i ovja phpmyadmin nesto pobudali ali ja nista u sql-u nisam menjao, nedao bog da sam preuzimao kljuceve iz drugih baza.
[ corelko @ 17.09.2011. 18:19 ] @
Problem je stvarno bio u ovom sto ovaj idTip je trazen u bazi mydb. Mozda je najbolje da tu bazu ipak pobrisem. Sad mi preostje da proverism sve strane kljuceve da se ovo nebi opet desavalo. Inace ovo sad sljaka, mada meni i dalje nije jasno kako je Tip_idTip u primarnom kljucu al eto, ako nece praviti probleme i nije steta :)
[ corelko @ 21.09.2011. 21:17 ] @
Uspeo sam jos da napravim deo oko logovanja korisnika kao i o privilegijama sta ko moze da vidi pa tako imam korisnicki i administratorski meni. To mi radi lepo. Napravio sam jos i deo za dodavanje kategorija proizvoda od stane administratora i evo tabele sa kategorijama:

Code:

--
-- Table structure for table `kategorija`
--

CREATE TABLE IF NOT EXISTS `kategorija` (
  `idKategorija` int(11) NOT NULL AUTO_INCREMENT,
  `naziv_kategorije` varchar(45) NOT NULL,
  PRIMARY KEY (`idKategorija`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

--
-- Dumping data for table `kategorija`
--

INSERT INTO `kategorija` (`idKategorija`, `naziv_kategorije`) VALUES
(1, 'Procesor'),
(2, 'Mticna ploca'),
(3, 'Monitor'),
(4, 'Hard disk'),
(5, 'RAM'),
(6, 'Graficka karta'),
(7, 'Napajanje'),
(8, 'Tastatura'),
(9, 'Mis'),
(10, 'Opticki uredjaj');



Sad je prirodno da administrator doda i neke prozvode. Kako to da organizujem? Dakle imam tabelu proizvod a imam i kateogrija_proizvod koje su trenutno prazne:

Code:

--
-- Table structure for table `proizvod`
--

CREATE TABLE IF NOT EXISTS `proizvod` (
  `idProizvod` int(11) NOT NULL,
  `naziv_proizvoda` varchar(45) DEFAULT NULL,
  `stanje` int(3) NOT NULL,
  PRIMARY KEY (`idProizvod`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `proizvod`
--


Code:

--
-- Table structure for table `kategorija_proizvod`
--

CREATE TABLE IF NOT EXISTS `kategorija_proizvod` (
  `Kategorija_idKategorija` int(11) NOT NULL,
  `Proizvod_idProizvod` int(11) NOT NULL,
  PRIMARY KEY (`Kategorija_idKategorija`,`Proizvod_idProizvod`),
  KEY `fk_Kategorija_has_Proizvod_Kategorija1` (`Kategorija_idKategorija`),
  KEY `fk_Kategorija_has_Proizvod_Proizvod1` (`Proizvod_idProizvod`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `kategorija_proizvod`
--


--
-- Constraints for dumped tables
--

--
-- Constraints for table `kategorija_proizvod`
--
ALTER TABLE `kategorija_proizvod`
  ADD CONSTRAINT `fk_Kategorija_has_Proizvod_Kategorija1` FOREIGN KEY (`Kategorija_idKategorija`) REFERENCES `kategorija` (`idKategorija`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_Kategorija_has_Proizvod_Proizvod1` FOREIGN KEY (`Proizvod_idProizvod`) REFERENCES `proizvod` (`idProizvod`) ON DELETE NO ACTION ON UPDATE NO ACTION;



Mene zanima kojim redosledom sad da unosim podatke. Da li prvo da unostim proizvode ili sta? Nekako je logicno kada administrator unosi proizvode je da ima formu da unose ime proizvoda, da odabere u koju kategoriju da ga smesti i da upise stanje tj koliko tih proizvoda ima u magacinu. Nije mi jasno kako to da odradim sa ove 2 tabele istovremeno?!?

[ biske86 @ 21.09.2011. 22:20 ] @
U tvom konkretnom primeru imaš jedan "šifarnik" koji se zove KATEGORIJA. Znači listu tih kategorija bi trebalo administrator da ubaci ili eventualno prilikom inicijalizacije baze da ostaviš neke vrednosti (ono što si već uradio). Naravno trebalo bi pored padajuće liste gde biraš kategoriju da postoji i dugme Dodaj, koje bi otvaralo novu formu gde bi mogao da uneseš novu kategoriju ako ne postoji u padajućoj listi. Na primer prvi put unosiš proizvod Samsung Galaksi Tab i trebalo bi da ga smestiš u kategoriju Tableti, ali je nemaš u padajućoj listi. Znači trebalo bi da klikneš na dugme Dodaj, uneseš novu kategoriju Tableti, program osveži padajuću listu i ti odatle izabereš kategoriju Tableti. Ali ovo o čemu pričamo je aplikativna logika nije pitanje vezano za baze podataka.
Znači da rezimiramo, prvo ide unos šifarnika pa posle unos ostalih tabela. Kako ćeš ti to u aplikaciji da izvedeš to je već drugo pitanje. Ono što je sa stanovišta baze podataka bitno to je da moraš da izvršiš unos u dva koraka tj. u dve insert naredbe.
[ corelko @ 21.09.2011. 22:36 ] @
Aha, jasno je to za kataegorije. Sto se tice proizvoda, hoces da kazes, kupim postove od idProizvoda, nazivaProizvoda i stanje i insertujem u tabelu proizvodi , a odmah nakon toga insert idProizvoda i idKategorije u tabelu kategorija_proizvodi. Jesam dobro ukapirao, insertujem prakticno u 2 tabele istovremeno?
[ biske86 @ 21.09.2011. 23:43 ] @
Da, samo možeš pre insertovanja da proveriš da li već postoji taj proizvod, npr:
Code:

if (postojiProizvod) {
  insert into proizvod_kategorija
else
  insert into proizvod
  insert into proizvod_kategorija

[ corelko @ 22.09.2011. 00:19 ] @
Hvala ! Pokusacu sutra pa cemo da vidimo mada nebi trebalo da bude problema.
[ corelko @ 22.09.2011. 23:15 ] @
Nisam stigao od obaveza danas da pousam da odradim ovaj insert. Nesto sam razmisljao kako da odradim ovo sa id-ovima ako mu se oni smestaju u bazu po auto_increment sistemu. Dakle ja kad unesim idProizvod u tabelu proizvod nigde ne govorim koji je to idProizvod nego pustim sistemu za upravljanje bazom da to sam odradi, e kako sad da taj isti idProizvod smestim i u tabelu kategorija_proizvodi. Ne znam da li me razumete? Jednostavno taj idProizvod ne pamtim nigde, ni u kakvoj promenljivoj.
[ corelko @ 23.09.2011. 21:38 ] @
biske imas mozda neku ideju kako ovo uraditi ili mozda savet kako se to inace radi? Mozda sad onaj auto_increment dolazi do izrazaja tj mozda id ne treba uopste da bude auto_increment?
[ biske86 @ 23.09.2011. 23:05 ] @
Bio sam nešto zauzet pa ti nisam odgovorio.
Ne znam kako se to obično radi ali mogu da ti kažem kako bi ja to uradio, onako na prvu.
Znači najpre ubaciš red u tabeli PROIZVOD:
Code (sql):
INSERT INTO PROIZVOD (naziv_proizvoda, stanje) VALUES ('Samsung Galaksi Tab', 50);

Zatim dohvatiš idProizvod na sledeći način:
Code (sql):
SELECT idProizvod
FROM proizvod
WHERE naziv_proizvoda='Samsung Galaksi Tab';

Naravno umesto konkretnih vrednosti koje sam naveo (Samsung Galaksi Tab) ti koristi promenljive sa forme.
Onda možeš ovaj idProizvod da koristiš za unos u tabelu KATEGODIJA_PROIZVOD.
Napomena: Da bi ovo radilo moraš da staviš da ti je polje naziv_proizvoda NOT NULL. Isto tako nad tim poljem bi trebalo da staviš UNIQUE indeks da ti se ne bi dešavalo da dva puta uneseš vrednost Samsung Galaksi Tab. Ukoliko ne bi stavio indeks onda bi korisnik mogao dva puta da unese ovu vrendost i onda bi upit kojim uzimaš vraćao dve vrednosti. Nadam se da razumeš o čemu pričam, ako ne reci da postavim konkretan primer.

P.S. Mislim da nisi trebao da postavljaš temu u podforumu MySQL, već si trebao da pitaš ove stvari na podforumu Baze podataka, zato što tvoja pitanja nisu vezana konkretno za MySQL već uopšteno za baze podataka. To to kažem i iz razloga što ima dosta ljudi koji su vrhunski u bazama podataka a ne navraćaju na podforum MySQL. Tamo bi sigurno dobio mnogo bolje odgovore vezane za ovakve stvari.
Još jedna napomena je da se stvari mogu uraditi na nivou baze podataka ili na nivou aplikacije. Definitivno je prvi način bolji ali je to u slučaju da dobro vladaš bazama podataka, ako ne onda ideš pa rešavaš ovakve i slične probleme na aplikacionom nivou. Konkretno u tvom primeru, na formi bi trebale da postoje dve liste, jedna za nazive proizvoda a druga za nazive kategorija. I ako ne postoji taj proizvod u listi onda bi trebalo da postoji dugme "Dodaj" i da se njegovim pritiskom otvori nova forma gde uneseš proizvod i kada pritisneš na sačuvaj onda bi forma trebalo da se zatvori i da pored toga osveži listu sa proizvodima. Nakon toga ti izabereš proizvod iz liste, izabereš kategoriju i to je to.


To je moje mišljenje, ali opet kažem možda ima i drugih rešenja ne znam, možda neko drugi da se javi pa da prodiskutujemo.
[ corelko @ 23.09.2011. 23:34 ] @
Hvala na iscrpnom odgovoru. Malo sam googlao i neces verovati sta sam pronasao. Pogledaj ne moram da objasnjavam:


Code:
mysql_insert_id();  



Code:
$id = mysql_insert_id(); 


Poslednji insertovani id, zanimljivo :D
[ biske86 @ 23.09.2011. 23:41 ] @
Odlično.
[ corelko @ 28.09.2011. 15:43 ] @
Kako je ovo moguce:

Pogledajte tabelu narudzba_proizvod:

Code:

-- phpMyAdmin SQL Dump
-- version 3.1.3.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Sep 28, 2011 at 04:35 PM
-- Server version: 5.1.33
-- PHP Version: 5.2.9-2

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Database: `prodavnica`
--

-- --------------------------------------------------------

--
-- Table structure for table `narudzba_proizvod`
--

CREATE TABLE IF NOT EXISTS `narudzba_proizvod` (
  `Narudzba_idNarudzba` int(11) NOT NULL,
  `Proizvod_idProizvod` int(11) NOT NULL,
  PRIMARY KEY (`Narudzba_idNarudzba`,`Proizvod_idProizvod`),
  KEY `fk_Narudzba_has_Proizvod_Narudzba1` (`Narudzba_idNarudzba`),
  KEY `fk_Narudzba_has_Proizvod_Proizvod1` (`Proizvod_idProizvod`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `narudzba_proizvod`
--

INSERT INTO `narudzba_proizvod` (`Narudzba_idNarudzba`, `Proizvod_idProizvod`) VALUES
(1, 1),
(1, 2),
(1, 4),
(1, 7),
(1, 8),
(1, 9),
(1, 10),
(1, 11),
(1, 12),
(1, 13),
(2, 1),
(2, 2),
(2, 4),
(2, 7),
(2, 8),
(2, 9),
(2, 10),
(2, 11),
(2, 12),
(2, 13);

--
-- Constraints for dumped tables
--

--
-- Constraints for table `narudzba_proizvod`
--
ALTER TABLE `narudzba_proizvod`
  ADD CONSTRAINT `fk_Narudzba_has_Proizvod_Narudzba1` FOREIGN KEY (`Narudzba_idNarudzba`) REFERENCES `narudzba` (`idNarudzba`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_Narudzba_has_Proizvod_Proizvod1` FOREIGN KEY (`Proizvod_idProizvod`) REFERENCES `proizvod` (`idProizvod`) ON DELETE NO ACTION ON UPDATE NO ACTION;

 


Iskren da budem nisam ni obratio paznju da mi je Workbench za Narudzba_idNarudzba i Proizvod_idProizvod stavio
da su primarni kljucevi i kako je to moguce ako je ta tabela nastala kao posledica veze vise: vise i oni treba da budu spoljni kljucevi. Medjutim oni su nekim cudom upisani pod PK ali kako sam onda uspeo da upisem ovoliko istih primarnih kljuceva???

Potpuno isti slucaj za tabelu konfiguracija_proizvod:
Code:

-- phpMyAdmin SQL Dump
-- version 3.1.3.1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Sep 28, 2011 at 04:40 PM
-- Server version: 5.1.33
-- PHP Version: 5.2.9-2

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Database: `prodavnica`
--

-- --------------------------------------------------------

--
-- Table structure for table `konfiguracija_proizvod`
--

CREATE TABLE IF NOT EXISTS `konfiguracija_proizvod` (
  `Konfiguracija_idKonfiguracija` int(11) NOT NULL,
  `Proizvod_idProizvod` int(11) NOT NULL,
  PRIMARY KEY (`Konfiguracija_idKonfiguracija`,`Proizvod_idProizvod`),
  KEY `fk_Konfiguracija_has_Proizvod_Konfiguracija1` (`Konfiguracija_idKonfiguracija`),
  KEY `fk_Konfiguracija_has_Proizvod_Proizvod1` (`Proizvod_idProizvod`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `konfiguracija_proizvod`
--


--
-- Constraints for dumped tables
--

--
-- Constraints for table `konfiguracija_proizvod`
--
ALTER TABLE `konfiguracija_proizvod`
  ADD CONSTRAINT `konfiguracija_proizvod_ibfk_1` FOREIGN KEY (`Konfiguracija_idKonfiguracija`) REFERENCES `konfiguracija` (`idKonfiguracija`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `konfiguracija_proizvod_ibfk_2` FOREIGN KEY (`Proizvod_idProizvod`) REFERENCES `proizvod` (`idProizvod`) ON DELETE NO ACTION ON UPDATE NO ACTION;


Naravno ovde dobijam gresku:
Duplicate entry PRIMARY KEY

Pokusao sam da izbrisem PRIMARY KEY (`Konfiguracija_idKonfiguracija`,`Proizvod_idProizvod`), ali nije uspelo.
Kako da prevazidjem ovo sa tabelom konfiguracija_proizvod???

[ biske86 @ 28.09.2011. 16:19 ] @
Kao prvo, Vorkbenč radi samo ono što mu kažeš. Nije on ništa stavio "sam". Ti si nacrtao tabelu i onda si ih povezao "indentifikujućom" vezom, koja je na dijagramu predstavljena kao neprekidna linija. Ako ostavimo teoriju po strani, identifikujuća veza znači da primarni ključ iz jedne tabele treba da se prenese kao primarni ključ u drugoj tabeli sa kojom se povezuje. Ako ne želiš ovu situaciju ti onda promeni vezu u neidentifikujuću: izabereš vezu između dve tabele pritisneš desni taster miša i iz padajućeg menija izabereš "Edit Relationship...". Na prozoru koji se pojavi izabereš karticu "Foreign Key", i odštikliraš "Identifying relation".
Pitaš zašto si uspeo da upišeš toliko istih primarnih ključeva. Pa ja ne vidim nigde dva ista primarna ključa. Ti ovde imaš kompozitni primarni ključ. Da bi za taj ključ imao iste vrednosti onda bi trebalo da imaš iste parove vrednosti, npr. da imaš sledeću situaciju
Code (sql):
INSERT INTO `narudzba_proizvod` (`Narudzba_idNarudzba`, `Proizvod_idProizvod`) VALUES
 (1, 1),
 (1, 1)
 

Ovo ne bi bilo dozvoljeno. Ali parovi (1, 1) i (1, 2) su različiti primarn ključevi.
Poenta kod primarnog ključa je da on jedistveno određuje jedan red u tabeli. I sada ako ti kažeš daj mi slog kod koga je primarni ključ (1, 1) baza tačno zna koji je to red. Ako bi imali više takvih redova onda baza ne bi znala koji red da nam vrati. Uglavnom pročitaj malo teoriju vezano za primarni ključ.
[ corelko @ 28.09.2011. 16:40 ] @
Hvala na detaljnom odgovoru. Pokusacu ovo da uradim u WB kako si rekao.


[ corelko @ 28.09.2011. 22:46 ] @
E hvala to je to. WorkBench je bas mocan alat i sto ti kazes nista ne radi slucajno. Ja sam na faxu koristio PowerDesigner i divio mu se al sve sto vise koristim WB sve mi se vise dopada.
[ corelko @ 31.10.2011. 13:30 ] @
Evo nakon duze pauze dosla potreba da se ozivi tema:)

Interesuje me sledece:
Posto imam dosta zavisnih tabela po podacima interesuje me kako "odraditi" brisanje nekih podataka ciji spoljni kljucevi u drugim tabelama. Evo kod mog eksperimentalnog projekta, konkretno cu izdvojiti najjednostavniji problem, imam tabele:

proizvod
Code:

--
-- Table structure for table `proizvod`
--

CREATE TABLE IF NOT EXISTS `proizvod` (
  `idProizvod` int(11) NOT NULL AUTO_INCREMENT,
  `naziv_proizvoda` varchar(75) DEFAULT NULL,
  `proizvodjac` varchar(32) NOT NULL,
  `cijena` varchar(6) NOT NULL,
  `stanje` int(3) NOT NULL,
  `idProizvodjac` int(2) NOT NULL,
  PRIMARY KEY (`idProizvod`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=29 ;

--
-- Dumping data for table `proizvod`
--



kategorija
Code:

--
-- Table structure for table `kategorija`
--

CREATE TABLE IF NOT EXISTS `kategorija` (
  `idKategorija` int(11) NOT NULL AUTO_INCREMENT,
  `naziv_kategorije` varchar(45) NOT NULL,
  `konfiguracija` varchar(2) NOT NULL,
  PRIMARY KEY (`idKategorija`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=23 ;

--
-- Dumping data for table `kategorija`
--


kategorija_proizvod
Code:

-- Table structure for table `kategorija_proizvod`

CREATE TABLE IF NOT EXISTS `kategorija_proizvod` (
  `Kategorija_idKategorija` int(11) NOT NULL,
  `Proizvod_idProizvod` int(11) NOT NULL,
  PRIMARY KEY (`Kategorija_idKategorija`,`Proizvod_idProizvod`),
  KEY `fk_Kategorija_has_Proizvod_Kategorija1` (`Kategorija_idKategorija`),
  KEY `fk_Kategorija_has_Proizvod_Proizvod1` (`Proizvod_idProizvod`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


-- Dumping data for table `kategorija_proizvod`

-- Constraints for dumped tables

-- Constraints for table `kategorija_proizvod`

ALTER TABLE `kategorija_proizvod`
  ADD CONSTRAINT `fk_Kategorija_has_Proizvod_Kategorija1` FOREIGN KEY (`Kategorija_idKategorija`) REFERENCES `kategorija` (`idKategorija`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_Kategorija_has_Proizvod_Proizvod1` FOREIGN KEY (`Proizvod_idProizvod`) REFERENCES `proizvod` (`idProizvod`) ON DELETE NO ACTION ON UPDATE NO ACTION;


Zelim da obrisem neki proizvod iz tabele proizvod ali njegov kljuc imam u tabeli kategorija_proizvod. I jeste logicno da se prvo obrise podatak o tom proizvodu u tabeli kategorija_proizvod pa tek onda da se brise taj proizvod iz tabele prozvod. Mene zanima da li to moze da se uradi nekako automatski, npr da kazem obrisi mi taj proizvod ali tako da obrises i sve tragove o njemu u tabelama u kojima on participira. Nadam se da me razumete. Hvala


[ bogdan.kecman @ 31.10.2011. 13:47 ] @
Citat:
13.3.5.4. FOREIGN KEY Constraints:
CASCADE: Delete or update the row from the parent table, and automatically delete or update the matching rows in the child table. Both ON DELETE CASCADE and ON UPDATE CASCADE are supported. Between two tables, do not define several ON UPDATE CASCADE clauses that act on the same column in the parent table or in the child table.

Note:
Currently, cascaded foreign key actions do not activate triggers.



[ corelko @ 31.10.2011. 14:25 ] @
Da li to znaci da moram da promenim strukturu tabela. NPR za kategorija_proizvod:

Code:

ALTER TABLE `kategorija_proizvod`
  ADD CONSTRAINT `fk_Kategorija_has_Proizvod_Kategorija1` FOREIGN KEY (`Kategorija_idKategorija`) REFERENCES `kategorija` (`idKategorija`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_Kategorija_has_Proizvod_Proizvod1` FOREIGN KEY (`Proizvod_idProizvod`) REFERENCES `proizvod` (`idProizvod`) ON DELETE CASCADE ON UPDATE CASCADE;


E da jos i ovo da pitam. Kada odradim DELETE tog mog proizvoda, pod uslovom da je "ON DELETE CASCADE" "sve sto mi treba", automatski ce se obrisati i tragovi o njemu u ostalim tabelama?


[ bogdan.kecman @ 31.10.2011. 14:33 ] @
da ako su strani kljucevi pravilno napravljeni .. obrati paznju na note za trigere
[ corelko @ 31.10.2011. 14:42 ] @
Hvala. Ja nisam koristio trigere niti imam u planu za ovaj deo da ih koristim tako da sad za sad mene to ne pogadja.
[ bogdan.kecman @ 31.10.2011. 15:26 ] @
ok, inace da vidis kako to sve radi napravi par testova, dodaj podatke pa ih updateuj i sa jedne i druge strane i gledaj kako se sta menja
[ corelko @ 31.10.2011. 23:01 ] @
E uspeo sam da odradim ovaj deo.
Pazi ovu situaciju sad:
Recimo da hocu da obrisem celu jednu kategoriju (npr prenosive memorije) i ovako kako sad stvari stoje ona ce uspesno da se obrise iz tabele kategorija kao i tragovi u kategorija_proizvod i to je ok. Medjutim proizvodi koji su pripadali toj kategoriji,naravno, ostaju u tabeli. Sta se u tom slucaju radi? Prakticno u bazi ostaju neki podaci koji se vise nikad nece iskoristiti.
[ bogdan.kecman @ 01.11.2011. 12:55 ] @
to znaci da nesto nisi dobro vezao stranim kljucevima