Normalizovana baza podataka
Postovanje. Vezban na jednoj normalizovanoj bazi podatka i dolazim do dela gde treba da upisem podatke u 2 tabele istovremeno. Da pojasnim, radi se kao o jednoj prodavnici racunara i imam administratora koji treba da unese proizvode i da ih razvrsta po kategorijama koji oni pripadaju pa tako imam tabelu kategorije (koja je vec puna), zatim imam tabelu proizovdi i imam tabelu kategorija_proizvodi koja se dobije zbog veze vise:vise. Administrator dakle ima formu gde unosi naziv proizvoda, birakategoriju kojoj pripada i unosi broj proizvoda. E imam problem sa ovim id-ovima koji su mi u tabelama auto_increment. E kad insertujem recimo u tabelu proizvod - insertujem naizv i stanje a id mi se ubaci samo od strane sistema za upravljanja bazama e kako sad taj isti id da insertujem i u tabelu kategorija_proizvod kad taj id nigde ne cuvam ne postoji u nekoj promenljivoj. Da li sad ovde nije pozeljno koristiti ovaj autoincrement ili praviti neku promenljivu gde cu cuvati id proizvoda ili pak nesto trece. Voleo bih kad bi neko iskusniji dao neki savet oko ovoga. Evo postavicu tabele da bude jasnije:
Tabela kategorija Kôd:
CREATE TABLE IF NOT EXISTS `kategorija` ( Kôd:
-- Kôd:
CREATE TABLE IF NOT EXISTS `kategorija_proizvod` ( |
MySQL:
PHP kôd:
PHP kôd:
PHP kôd:
PHP kôd:
PHP kôd:
|
WOW :D
Tenk ju maestro ;) Jasno ko dan ! Dobro samo sto cu ja morati da u kategorija_proizvod upisem jos i idKategorija iz tabele kategorija al sad je to prava poslastica :) |
Napisao si istovremeno, a to nije moguće, moguće je samo multiple query u MySQLi extenziji ali to nije pametno koristiti.
PHP kôd:
|
Mozda sam se pogresno izrazio ali treba da upisem podatke i u jednu i u drugu tabelu, ali logicno je da prvo upisem proizvode (id naziv i stanje) u tabelu proizvodi pa onda da upisem (Kategorija_idKategorija,Proizvod_idProizvod) u tabelu kategorija_proizvod. Kategorije su prethodno upisane.
A kako doci do Kategorija_idKategorija, pa da sa $_POST kako bih mogao drugacije? Da li mozda postoji neko bolje i prakticnije resenje od ovoga? Dakle ja uglavnom moram da omogucim administratoru da on moze da dodaje proizvode u tabelu proizvodi i da ih rasporedjuje po kategorijama, a to ce da uzrokuje da moram da popunjavam i tabelu kategorija_proizvodi sa id-ovima od proizvoda i kategorija jer je to valjda sustina normalizacije, da izbegnem dupliranje podataka itd. Jos jedno pitanje, zasto nije pametno koristi mysqli ? Da li ta funkcija bukvalno omogucava istovremeni upis u obe tabele? Meni to i ne treba, zar ne? |
Ne treba ti, ako ti treba, ne radiš dobro :)
MySQLi (improved) je ekstenzija a to je samo jedna od njenih funkcija (http://php.net/manual/en/book.mysqli.php)... Pa ne, preko POST naravno, a kako si napisao učinilo mi se kao da je neki problem :) Jeste to normalizacija, upravo sam radio za djevojku neku Access bazu (pohađa napredni kurs za Office)... Uglavnom, predavač je rekao da ne mora da ima ovoliko tabela i da to može sve u jednu tabelu jer je lakše, takođe može staviti PRIMARY na VIN (koji je sastoji od slova i brojeva), talking about normalization :) |
Ma da , necu ulaziti sad u taj mysqli :D Pokusacu sutra ovo da insertujem pa se javljam, nebi trebalo biti problema.
E gledam ovaj Access :D Jel se moze ovo danas negde iskoristiti ? |
Nema razloga da ne koristis mysqli, to je samo drugaciji (noviji) drajver za mysql bazu, koji omogucava neke bitne stvari, recimo prepare statements i da se logujes u bazu sa novim sistemom cuvanja sifri koji je sigurniji. Ali jos bolje je da umesto mysqli odmah preskocis i naucis PDO, to je isto drajver, ali ne samo za mysql, vec podrzava razne baze.
Sto se tice multi-query postoje neke sigurnosne implikacije sa tom f-jom, pa se zato ne preporucuje, a sem toga to nije ono sto tebi treba. Bitno je da razumes kako se SQL izvrsava: php posalje svom drajveru SQL string koji si zadao, on to prosledi bazi, baza kompajlira SQL string u komandu i onda je izvrsi. Kad imas vise komandi njih moras da izvrsis sekvencijalno, jednu po jednu, i svaka ce proci kroz sve ove korake. Ono sto multiquery pomaze je sto mozes u jednom pozivu bazi da posaljes vise komandi, pa stedis na konekcijama ka bazi, koje su inace najsporiji deo operacije. Ali posle toga se sve odvija isto, tj. i dalje se izvrsava jedna po jedna komanda Druga stvar koju treba da razumes je pojam atomske operacije u bazi. To je operacija koju mozes da zamislis da se obavlja u jednom koraku, tj. ona ili ne uspe, ili se izvrsi onako kako je zadano, druge operacije koje se izvrsavaju u bazi ne mogu da uticu na njen rezultat. U mysql-u je svaka pojedina komanda atomska, znaci ako kazes UPDATE tabela SET a=5, b=6; ti znas da ce na svakom redu u tabeli a i b biti toliko, ne moze da se promeni samo a ili samo na par redova. Medjutim kad imas vise komandi onda to ije atomska operacija, znaci bilo kakve izmene u bazi koje neko drugi radi mogu da ti uniste relacije (veze id-jeva koje imas, sto se jednim imenom zove referencijalni integritet baze). Da se to ne bi desilo koriste se transakcije, a posto koristis InnoDB engine ja bih ti preporucio da sve te svoje operacije zatvoris izmedju START TRANSACTION i COMMIT komandi. Vise o tome mozes da procitas ovde: http://dev.mysql.com/doc/refman/5.0/en/commit.html |
Hvala na korisnim informacijama. Iskren da budem iako sam transakcije malo proucavao na faxu i kao rauzmeo tad nesto sad nebih znao primeniti niti jednu na ovaj moj problem iako sam pogledao ovaj link. Znam da je to kao jedan od nasigurnijih nacina upravljanja bazama podataka i da se koristi recimo u bankama.
Sto se tice ovog mog problema meni ne treba sad nesto toliko efikasno resenje, mada sto ti rece treba ovo sve preskociti i baviti se ovim efikasnijim nacinima upravljanja bazama al eto treba nauciti i ove skolske primere pa onda preci na ono sto se u praksi primenjuje. Ako imas jos negde konkretnih primera primena transakcija na neke upise postavi, mozda kad ovo zavrsim bas krenem da se bavim time. Sto se tice ovih mojih upita imao bih jos jedno pitanje. Posto meni treba da upisem podatke prvo u jednu pa u drugu tabelu, ne istovremeno :D , da li ovaj primer sto je webarto naveo moze da se primeni u mom slucaju: Kôd:
$query = "INSERT INTO proizvodi(naziv_proizvoda,stanje) VALUES('kompujtor', 5); |
Uradi kako sam ti prvo napisao, znači uzmi ID u $id varijablu, možeš i ovo drugo ali je nepotrebno komplikovanje, ništa ne dobijaš osim veće šanse za greške. Htio sam ti samo reći da ne možeš 2 INSERTa u 2 tabele uraditi u jednom queryu, u svakom slučaju su 2 querya. Ovaj drugi primjer bi trebao isto da radi.
U drugom INSERTu ima SELECT koji kupi zadnji ID odosno taj idProizvod... PHP kôd:
|
U redu
|
E ja sam kralj najveci na svetu :D Ne mogu da uhvatim idKategorija iako sam mislio da cu to znati da uradim. Malo me zbunila ova moja select lista ali moram na ovja nacin administratoru da omogucim da izabere kategoriju gde ce smestiti proizvod. Evo kako sam to uradio:
Kôd:
$kategorija= "SELECT * FROM kategorija ORDER BY idKategorija DESC"; Kôd:
$red['idKategorija'] Kôd:
$red['idKategorija'] Kôd:
$red['naziv_kategorija'] |
Nisam siguran da li sam dobro razumeo problem. Možeš da id uneseš u value atribut option html taga, dakle:
Kôd:
echo '<option value="' . $red['idKategorija'] . '">' . $red['naziv_kategorije'] . '</option>'; Kôd:
$idKategorija = $_POST['kategorija']; |
Da da da moze to sigurno al nije mi palo na pamet. Videces da se webarto da potvrdi to :D
|
Konacno sam uspeo. Evo kako sam postavio upite pa vi recite jel moze proci:
Kôd:
if (isset($_POST['submit'])) |
Haha, kralj si. Potvrđujem Brankovo ;)
|
Citat:
|
Valjalo bi malo jos sa ovim experimentisati. Kad sam uneo fino proizvode, kategorije, odredio koji proizvodi pripadaju kojoj kategoriji sad bi trebao da ponudim korisnicima da izaberu konfiguraciju koju cu da smestam u jednu tabeli koja ce mi se zvati narudzbe. Ajde da ostavim smestanje za kasnije. Mene interesuje kako sad iz ove sume ponuditi korisniku listu svih proizvoda koje imam da on odabere za iz svake kategorije po jedan. Recimo imacu formu na kojoj cu da prikazem sledece:
Procesor: Maticna ploca: RAM: Da li je mozda najzgodnije da koristim select liste kao sto sam radio za smestanje proizvoda u odredjenu kategoriju, nekako skoro svi takvi sistemi rade na tom principu. Ali kako iscupati podatke iz ove 3 tabele kategorije, proizvodi i kategorija_proizvod?!?Neki predlog? |
Malko naprednije: http://code.google.com/p/tungsten-re...icatorCookbook
Ukoliko ti je ovo gore "preobimno" od verzije 5.1 trigger-i rade odlicno, nema razloga da ih ne koristis. |
Ih kad bih ja znao primeniti na ovo moje. Znam da se ovo moze uraditi sa JOIN ali nisam nikad ovako nista za mene "komplikovano" radio pa bi trebao neko da me uputi. Mozda bi ja nekako i znao iscupati podatke ali nebih znao kako da ih organizujem u ove select liste.To je problem
|
^ Možda ti ovo može pomoći: besplatan db kurs Introduction to Databases (Stanford University)
|
hhehe nn.nn :D pa nije na odmet. Resio sam problem ali se odmah javio i drugi :D
|
Vreme je GMT +2. Trenutno vreme je 01:38. |
Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.