Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Normalizacija baze

[es] :: MySQL :: Normalizacija baze

Strane: 1 2 3

[ Pregleda: 5963 | Odgovora: 42 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Normalizacija baze06.09.2011. u 13:57 - pre 153 meseci
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 ?!?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Normalizacija baze06.09.2011. u 14:35 - pre 153 meseci
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.
 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Re: Normalizacija baze07.09.2011. u 16:33 - pre 153 meseci
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





 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Normalizacija baze07.09.2011. u 22:41 - pre 153 meseci
konfiguracija - zasto kopiras u tu tabelu tip usera?
korisnik_narudzba - isto pitanje

ostalo je sve ok

 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Re: Normalizacija baze07.09.2011. u 23:00 - pre 153 meseci
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 .
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Normalizacija baze07.09.2011. u 23:09 - pre 153 meseci
da , zato sto si bacio tip u PK, izbaci tip iz PK-a, nema potrebe da sedi tamo
 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Re: Normalizacija baze07.09.2011. u 23:13 - pre 153 meseci
hvala to cu da prepravim !
 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Re: Normalizacija baze08.09.2011. u 13:44 - pre 153 meseci
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 :)




 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Normalizacija baze08.09.2011. u 13:45 - pre 153 meseci
treba ti tabela "konfiguracija_proizvod"
 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Re: Normalizacija baze08.09.2011. u 13:59 - pre 153 meseci
znam i ja nesto xD

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


 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Normalizacija baze08.09.2011. u 14:07 - pre 153 meseci
@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.
 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Re: Normalizacija baze08.09.2011. u 14:24 - pre 153 meseci
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


 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Normalizacija baze08.09.2011. u 14:47 - pre 153 meseci
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
 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
94.250.9.*



+6 Profil

icon Re: Normalizacija baze08.09.2011. u 15:48 - pre 153 meseci
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 ?
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Normalizacija baze08.09.2011. u 16:29 - pre 153 meseci
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š.
 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Re: Normalizacija baze17.09.2011. u 14:59 - pre 153 meseci
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?!?
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Normalizacija baze17.09.2011. u 16:38 - pre 153 meseci
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.
 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Re: Normalizacija baze17.09.2011. u 17:22 - pre 153 meseci
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 ?
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Normalizacija baze17.09.2011. u 17:38 - pre 153 meseci
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


 
Odgovor na temu

corelko

Član broj: 165571
Poruke: 92
*.teol.net.



+6 Profil

icon Re: Normalizacija baze17.09.2011. u 18:07 - pre 153 meseci
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.
 
Odgovor na temu

[es] :: MySQL :: Normalizacija baze

Strane: 1 2 3

[ Pregleda: 5963 | Odgovora: 42 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.