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

Pitanje iz MySQL-a

[es] :: MySQL :: Pitanje iz MySQL-a

[ Pregleda: 2422 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

zeko_sisko
Kobe Bryant

Član broj: 224214
Poruke: 14
*.teol.net.



+1 Profil

icon Pitanje iz MySQL-a10.04.2013. u 20:15 - pre 104 meseci
Pozdrav svima.

Imao bih jedno pitanje vezano za MySQL. Interesuje me da li je sledecu stvar moguce odraditi u MySQL, i ako jeste, kako?

Naime, da li je moguce da u nekoj tabeli, koja ima, npr. kolone pod imenom kol1 (neka ona bude prim kljuc), kol2, kol3, kol4 automatski pri unosu podataka u kol4 upisuje zbir podataka koji se nalaze u kol2 i kol3? Podrazumijeva se da su oni svi int tipa.

Meni, inace, treba nesto komplikovanija operacija racunanja, ali najlakse mi je bilo objasniti na ovako banalnom primjeru.



Hvala.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15502
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2346 Profil

icon Re: Pitanje iz MySQL-a10.04.2013. u 20:35 - pre 104 meseci
moze
za to se koristi trigger
 
Odgovor na temu

zeko_sisko
Kobe Bryant

Član broj: 224214
Poruke: 14
*.teol.net.



+1 Profil

icon Re: Pitanje iz MySQL-a10.04.2013. u 20:54 - pre 104 meseci
Hvala @bogdane. Pretpostavljao sam i sam da bi se tu trebao koristiti trigger insert, ali nisam bio siguran. Pozdrav
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15502
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2346 Profil

icon Re: Pitanje iz MySQL-a12.04.2013. u 01:47 - pre 104 meseci
da ne ide preko pp ..

Code:

mysql> CREATE TABLE `t1` (
    -> `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    -> `a` INT NOT NULL,
    -> `b` INT NOT NULL,
    -> `c` INT 
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TRIGGER insertT1
    -> BEFORE INSERT ON t1 FOR EACH ROW SET NEW.c = NEW.a+NEW.b;
Query OK, 0 rows affected (0.05 sec)

mysql> CREATE TRIGGER updateT1
    -> BEFORE UPDATE ON t1 FOR EACH ROW SET NEW.c = NEW.a+NEW.b;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into t1 (a,b) values (10,1), (20,2), (30,3), (100, 1), (200,20);
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+----+-----+----+-----+
| id | a   | b  | c   |
+----+-----+----+-----+
|  1 |  10 |  1 |  11 |
|  2 |  20 |  2 |  22 |
|  3 |  30 |  3 |  33 |
|  4 | 100 |  1 | 101 |
|  5 | 200 | 20 | 220 |
+----+-----+----+-----+
5 rows in set (0.00 sec)

mysql> update t1 set b=100 where id=3;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t1;
+----+-----+-----+-----+
| id | a   | b   | c   |
+----+-----+-----+-----+
|  1 |  10 |   1 |  11 |
|  2 |  20 |   2 |  22 |
|  3 |  30 | 100 | 130 |
|  4 | 100 |   1 | 101 |
|  5 | 200 |  20 | 220 |
+----+-----+-----+-----+
5 rows in set (0.00 sec)

mysql> update t1 set b=333 where id > 3;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from t1;
+----+-----+-----+-----+
| id | a   | b   | c   |
+----+-----+-----+-----+
|  1 |  10 |   1 |  11 |
|  2 |  20 |   2 |  22 |
|  3 |  30 | 100 | 130 |
|  4 | 100 | 333 | 433 |
|  5 | 200 | 333 | 533 |
+----+-----+-----+-----+
5 rows in set (0.00 sec)

mysql> 


 
Odgovor na temu

zeko_sisko
Kobe Bryant

Član broj: 224214
Poruke: 14
*.teol.net.



+1 Profil

icon Re: Pitanje iz MySQL-a13.04.2013. u 19:09 - pre 103 meseci
E, ja sa jednog problema idem na drugi.

Kako da napravim trigger koji za izmjenu podataka u nekoj tabeli, automatski mijenja taj podatak i u drugoj tabeli.

Neka su tabele sledeceg sadrzaja:

Code:

   create table profil
  (sifprof     char(5)   not null,
   nazivprof   char(35)  not null ,
   primary key (sifprof));

   create table predmet
  (sifprof     char(5)   not null,
   sifpred     char(5)   not null,
   nazivpred   char(40)  not null ,
   primary key (sifprof, sifpred),
   foreign key (sifprof) 
               references profil (sifprof) on delete restrict);


E, sada, ja hocu ako kojim slucajme promjenim podatke u tabeli profil, tj. promjenim polje sifprof da mi se automatski promjeni i u tabeli predmet. A, ako obrisem red u tabeli profil, da mi se obrise red u tabeli predmet sa odgovarajucim poljem sifprof.

Ja sam nesto pokusao, ali ne ide. Evo mog pokusaja.

Code:

CREATE TRIGGER `trigger1` AFTER UPDATE ON `profil`
FOR EACH ROW begin
set @sifra = (select sifprof from profil);
update predmet
set new.sifprof = @sifra;
end;
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1341
*.dynamic.sbb.rs.



+310 Profil

icon Re: Pitanje iz MySQL-a13.04.2013. u 23:07 - pre 103 meseci
^
Zar ovo što si napisao ne rešava referencijalni integritet automatski?
Mislim u MS SQL-u je tako bar zadnjih 15 godina a valjda ima toga i u MySQL-u???

Edit:
Vidim da to rešava referenca sa...
ON UPDATE CASCADE
ON DELETE CASCADE
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15502
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2346 Profil

icon Re: Pitanje iz MySQL-a13.04.2013. u 23:19 - pre 103 meseci
dusane tesko da mssql na "on delete restrict" radi promenu u slucaju delete / update-a, ako radi onda tu nesto gadno ne valja, restrict treba samo da zabrani promenu ako ona kvari ref.int.

zeko, za to sto hoces ti ne treba triger vec sto rece dusan moze da se resi sa stranim kljucevima samo umeso on delete restrict treba da imas (podrazumeva se innodb, sa myisam to nista ne radi, ali svejedno myisam treba da zaboravis da postoji):
http://dev.mysql.com/doc/refma...create-table-foreign-keys.html

dakle treba ti i on delete cascada i on update cascade ako hoces da na brisanje brise a na update menja vrednost


 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1341
*.dynamic.sbb.rs.



+310 Profil

icon Re: Pitanje iz MySQL-a13.04.2013. u 23:23 - pre 103 meseci
Mislim da sam napisao ON DELETE CASCADE gore... a zeko je napisao ON DELETE RESTRICT
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15502
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2346 Profil

icon Re: Pitanje iz MySQL-a13.04.2013. u 23:27 - pre 103 meseci
nije bilo tog dela kad sam ja pisao odgovor, bilo samo "zar ovo sto si napisao...." a napisao je restrict :D sad vidim da si dodao cascade .. bitno da smo mu dali koristan info :)

inace na mysql-u cascade promene ne trigeruju trigere cisto da znas ako dodajes triger na te kolone da ga to nece okinuti
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1341
*.dynamic.sbb.rs.



+310 Profil

icon Re: Pitanje iz MySQL-a13.04.2013. u 23:33 - pre 103 meseci
Ahah, a i pretpostavio sam da nisi video edit...
Nisam koristio MySql pa onda dok sam pronašao i potvrdio da to postoji ode par minuta na research :)
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15502
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2346 Profil

icon Re: Pitanje iz MySQL-a13.04.2013. u 23:41 - pre 103 meseci
ma opusteno, es mi je nesto extra spor pa onda gledam poruke na mailu a na mail uopste ne dolazi edit, sto je najbolje videh poruku na mailu a odgovorih na sajtu al nije bilo edita kad sam krenuo da kucam poruku (u mailu ga nema i dalje no to je normalno) ...

ima mysql dosta toga vec duuuugo vremena, da ne kazem sve (i dalje nema fenseraj poput array tipa i slicno) :) ... a ovako iz mog ugla jos od SUN-a ideja je da se "pobedi mssql" a koliko cujem nesto po nekim silikonska dolina krugovima izgleda da smo prebacili mssql po svim merilima (kolicini instalacija odavno, ali po kolicini zarade, kolicini date, velicini firmi koje koriste, kolicini pare koje se vrte etc etc...) ... na zalost to su sve kuloarske price tako da nista tu nema neko da barata sa "hard data" mada isti ti kuloari su do skoro pricali kako je mysql ipak jos uvek dosta ispod mssql-a tako da .. bem li ga.. vidim da je na nekim sajtovima isto izbio na drugo mesto no i tu je tehnologija odredjivanja popularnosti vrlo diskutabilna a za benchmarke je jos posebna prica, sto rece moj bivsi sef cika monti videnius "reci mi koje 2 baze ces da poredis i koja hoces da pobedi i ja cu ti napraviti testove koji ce to pokazati nedvosmisleno"
 
Odgovor na temu

zeko_sisko
Kobe Bryant

Član broj: 224214
Poruke: 14
*.teol.net.



+1 Profil

icon Re: Pitanje iz MySQL-a14.04.2013. u 10:12 - pre 103 meseci
I ja sam stvarno priglup. :D Od kuda sam ja sebi utuvio da se to treba triggerom, kada je ovo mnogo jednostavnije, pojma nemam. U svakom slucaju, hvala.
 
Odgovor na temu

zeko_sisko
Kobe Bryant

Član broj: 224214
Poruke: 14
*.teol.net.



+1 Profil

icon Re: Pitanje iz MySQL-a14.04.2013. u 14:36 - pre 103 meseci
Imam jos jedan problem, a nadam se da poslije toga vas vise necu smarati. Evo u cemu je stvar.

Ako imam bazu, kod koje su neke od relacija:

Profili:

Code:

create table profili
  (sifprof     char(5)   not null,
   nazivprof   char(35)  not null ,
   primary key (sifprof));



Plans:

Code:

create table plans
  (sifprof     char(5)   not null,
   sifpred     char(5)   not null,
   nazivpred   char(40)  not null ,
   primary key (sifprof, sifpred),
   foreign key (sifprof) 
               references profili (sifprof) on delete cascade on update cascade);



Nastavnici:

Code:

create table nastavnici
  (jmbg        char(13) not null,
   ime         char(20) not null ,
   prezime     char(20) not null ,
   primary key (jmbg));



Meni treba relacija koja ove tri relacije povezuje, tj. trebam relaciju u kojoj ce se nalaziti podaci o profesoru, predmetu koji predaje, na kojoj godini predaje i podaci o profilu. Uzet cemo da jedan profesor moze na jednoj godini predavati samo jedan predmet, ali taj predmet se moze nalaziti u vise profila.

Ja sam kreirao tu tabelu, ali je ne mogu povezati sa ostalim, tj. izbacuje mi gresku. Evo mog koda.

Nastava:

Code:

CREATE TABLE `NewTable` (
`jmbg`  char(14) NOT NULL ,
`godina`  smallint NOT NULL ,
`sifpred`  char(5) NOT NULL ,
`sifprof`  char(5) NOT NULL ,
PRIMARY KEY (`jmbg`, `godina`, `sifpred`),
FOREIGN KEY (`jmbg`) REFERENCES `profesori` (`jmbg`) ON DELETE RESTRICT ON UPDATE RESTRICT,
FOREIGN KEY (`sifpred`) REFERENCES `plans` (`sifpred`) ON DELETE RESTRICT ON UPDATE RESTRICT
)
;


Tu bi negdje trebalo, mozda, ubaciti i sifprof, ali sve sto sam pokusao, nije moglo.

[Ovu poruku je menjao zeko_sisko dana 14.04.2013. u 19:57 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15502
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2346 Profil

icon Re: Pitanje iz MySQL-a15.04.2013. u 01:12 - pre 103 meseci
napisi koju gresku dobijas
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3124

Jabber: djoka_l


+1328 Profil

icon Re: Pitanje iz MySQL-a15.04.2013. u 10:20 - pre 103 meseci
Citat:
Imam jos jedan problem, a nadam se da poslije toga vas vise necu smarati.

Imaš malo više od jednog problema. Pretpostavljam da si početnik/student, sudeći po ovome što si pisao.

Tvoj najveći problem je očajan dizajn baze.

Pogledaj samo tabelu plans (uzgred, nazivi tabela bi trebalo da budu u jednini, a ne u množini. To nije toliko bitno ako si konzistentan, ali to što su ti dve od tabela na srpskom i u množini, a dve na engleskom i to jedna u množini, a druga u jednini je odvratno.)
Elem, vratimo se na "plans". Očigledno je da si ovde strpao i sifru predmeta i naziv predmeta (a mogao bi i da koristiš cele reči, a ne skraćenice), dok kasnije kažeš:
Citat:
Uzet cemo da jedan profesor moze na jednoj godini predavati samo jedan predmet, ali taj predmet se moze nalaziti u vise profila.


Dakle jedan predmet (sifrapred, nazivpred) može da se nalazi u više profila, pa si očigledno bez razloga narušio 3NF.

Sledeće, jmbg je očajan izbor primarnog ključa. To će ti doći sa praksom, za sada prihvati to kao činjenicu. Još gore je što ti je u tabeli nastavnici on char(13) a u NewTable char(14).

Uopšte, svi primarni ključevi su ti očaj. Dosta se diskutuje oko toga da li primarni ključ treba da bude veštački (sekvenca), ili je u redu da primarni ključ bude neka "prirodna" karakteristika (kao jmbg fizičkog lica ili sifprof - sifra profila). U tvom slučaju, čim razmišljaš o tome da je moguće da se primarni ključ promeni ili briše očigledno je da si ODABRAO POGREŠAN PRIMARNI KLJUČ.

Ako je tebi sifra profile, na primer "RTI" zbog nečega bitna, samogovoreća, onda je ona loš primaran ključ. Primarni ključ treba da identifikuje red u tabeli i da služi za povezivanje sa drugom tabelom, a ne da nešto očigledno znači onome ko gleda u slog.

Na primer, aki želiš da promeniš primarni ključ sa "ABC" na "XYZ" tu nešto smrdi. A ako je primarni ključ sloga u kojem je sifpred "ABC" vrednost 14, da li imaš bilo kakvu potrebu da ga ikada menjaš. Pa onda veza za plans je preko ključa 14 i nema potreba da se ažurira child tabela kada u parentu promeniš sifprof.

Sama pomisao da brišeš nešto u tabelama je problematična. U većini netrivijalnih informacionih sistema NIŠTA SE NE BRIŠE.
Zamisli situaciju da je postojao profil po kojem su studenti slušali i davali ispite, pa se onda on ukine ili promeni. Tada bi taj profil trebalo samo da postane neaktivan, kako bi se sačuvala veza sa studentima koji su nekada bili na tom profilu.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15502
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2346 Profil

icon Re: Pitanje iz MySQL-a15.04.2013. u 11:35 - pre 103 meseci
sve sto je kolega napisao, potpisujem 100%
 
Odgovor na temu

zeko_sisko
Kobe Bryant

Član broj: 224214
Poruke: 14
*.teol.net.



+1 Profil

icon Re: Pitanje iz MySQL-a15.04.2013. u 14:27 - pre 103 meseci
E, momci, hvala puno na savjetima.

Sto se tice imena tabela, i oznaka u njima, ja sam kod kopirao iz dvije slicne tabele (mrsko mi bilo kucati) pa je zato dolazilo do toga da u jednom imamo polje duzine 14, a u drugom 13.

Sto se tice izbora primarnih kljuceva, nije mi bas jasno zasto je izbor los, ako vi i sami kazete da se primarni kljuc rijetko kada mijenja ili brise. Ja sam to pitao zbog jedne druge stvari, cisto da mi bude jasno.

Ja cu postaviti sada kompletan kod moje baze, pa ako neko bude imao vremena da pogleda i sugerise sta bih trebao izmjeniti, bio bih mu zahvalan.



Code:

/*
Navicat MySQL Data Transfer

Source Server         : localhost_3306
Source Server Version : 50520
Source Host           : localhost:3306
Source Database       : studentska_sluzba

Target Server Type    : MYSQL
Target Server Version : 50520
File Encoding         : 65001

Date: 2013-04-15 15:07:49
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `dosije`
-- ----------------------------
DROP TABLE IF EXISTS `dosije`;
CREATE TABLE `dosije` (
  `indeks` smallint(6) NOT NULL,
  `dan` smallint(6) NOT NULL,
  `mjesec` smallint(6) NOT NULL,
  `godina` smallint(6) NOT NULL,
  `ime` char(20) NOT NULL,
  `prezime` char(20) NOT NULL,
  `roditelj` char(20) NOT NULL,
  `jmbg` char(14) NOT NULL,
  `dan_rodjenja` smallint(6) NOT NULL,
  `mjesec_rodjenja` smallint(6) NOT NULL,
  `godina_rodjenja` smallint(6) NOT NULL,
  `mjesto_rodjenja` char(15) NOT NULL,
  `adresa` char(40) NOT NULL,
  `sifra_profila` char(5) NOT NULL,
  `naziv_diplomskog` char(50) NOT NULL,
  `dan_diplomiranja` smallint(6) NOT NULL,
  `mjesec_diplomiranja` smallint(6) NOT NULL,
  `godina_diplomiranaj` smallint(6) NOT NULL,
  `prosjek` double NOT NULL,
  `email` char(50) NOT NULL,
  PRIMARY KEY (`indeks`,`godina`),
  KEY `sifra_profila` (`sifra_profila`),
  CONSTRAINT `dosije_ibfk_1` FOREIGN KEY (`sifra_profila`) REFERENCES `profil` (`sifra_profila`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Svi studenti koji su upisali jedan od profila na fakultetu.';

-- ----------------------------
-- Records of dosije
-- ----------------------------

-- ----------------------------
-- Table structure for `kvota`
-- ----------------------------
DROP TABLE IF EXISTS `kvota`;
CREATE TABLE `kvota` (
  `sifra_profila` char(5) NOT NULL,
  `godina_upisa` smallint(6) NOT NULL,
  `br_stud_red` smallint(6) NOT NULL,
  `br_stud_van` smallint(6) NOT NULL,
  PRIMARY KEY (`sifra_profila`,`godina_upisa`),
  CONSTRAINT `kvota_ibfk_1` FOREIGN KEY (`sifra_profila`) REFERENCES `profil` (`sifra_profila`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of kvota
-- ----------------------------

-- ----------------------------
-- Table structure for `nastava`
-- ----------------------------
DROP TABLE IF EXISTS `nastava`;
CREATE TABLE `nastava` (
  `jmbg` char(14) NOT NULL,
  `sifra_profila` char(5) NOT NULL,
  `sifra_predmeta` char(5) NOT NULL,
  PRIMARY KEY (`jmbg`,`sifra_predmeta`),
  KEY `sifra_profila` (`sifra_profila`,`sifra_predmeta`),
  CONSTRAINT `nastava_ibfk_1` FOREIGN KEY (`jmbg`) REFERENCES `profesor` (`jmbg`),
  CONSTRAINT `nastava_ibfk_2` FOREIGN KEY (`sifra_profila`, `sifra_predmeta`) REFERENCES `plan` (`sifra_profila`, `sifra_predmeta`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of nastava
-- ----------------------------

-- ----------------------------
-- Table structure for `plan`
-- ----------------------------
DROP TABLE IF EXISTS `plan`;
CREATE TABLE `plan` (
  `sifra_profila` char(5) NOT NULL,
  `sifra_predmeta` char(5) NOT NULL,
  `naziv_predmeta` char(40) NOT NULL,
  `pocetni_semestar` smallint(6) NOT NULL,
  `zavrsni_semestar` smallint(6) NOT NULL,
  `br_predavanja` smallint(6) NOT NULL,
  `br_vjezbi` smallint(6) NOT NULL,
  PRIMARY KEY (`sifra_profila`,`sifra_predmeta`),
  CONSTRAINT `plan_ibfk_1` FOREIGN KEY (`sifra_profila`) REFERENCES `profil` (`sifra_profila`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;

-- ----------------------------
-- Records of plan
-- ----------------------------

-- ----------------------------
-- Table structure for `polagao`
-- ----------------------------
DROP TABLE IF EXISTS `polagao`;
CREATE TABLE `polagao` (
  `indeks` smallint(6) NOT NULL,
  `godina` smallint(6) NOT NULL,
  `sifra_predmeta` char(5) NOT NULL,
  `ocjena_pismeno` smallint(6) NOT NULL,
  `ocjena_usmeno` smallint(6) NOT NULL,
  `ocjena` smallint(6) NOT NULL,
  `dan_polag_pismeni` smallint(6) NOT NULL,
  `mjesec_polag_pismeni` smallint(6) NOT NULL,
  `godina_polag_pismeni` smallint(6) NOT NULL,
  `dan_polag_usmeni` smallint(6) NOT NULL,
  `mjesec_polag_usmeni` smallint(6) NOT NULL,
  `godina_polag_usmeni` smallint(6) NOT NULL,
  `broj_polaganja` smallint(6) NOT NULL,
  `ispitivac` char(40) NOT NULL,
  PRIMARY KEY (`indeks`,`godina`,`sifra_predmeta`,`broj_polaganja`),
  CONSTRAINT `polagao_ibfk_1` FOREIGN KEY (`indeks`, `godina`) REFERENCES `dosije` (`indeks`, `godina`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of polagao
-- ----------------------------

-- ----------------------------
-- Table structure for `prijavio`
-- ----------------------------
DROP TABLE IF EXISTS `prijavio`;
CREATE TABLE `prijavio` (
  `indeks` smallint(6) NOT NULL,
  `godina` smallint(6) NOT NULL,
  `sifra_predmeta` char(5) NOT NULL,
  `rok_mjesec` char(10) NOT NULL,
  `rok_godina` smallint(6) NOT NULL,
  `profesor` char(40) NOT NULL,
  `puta` smallint(6) NOT NULL,
  PRIMARY KEY (`indeks`,`godina`,`sifra_predmeta`,`rok_mjesec`,`rok_godina`,`puta`),
  CONSTRAINT `prijavio_ibfk_1` FOREIGN KEY (`indeks`, `godina`) REFERENCES `dosije` (`indeks`, `godina`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of prijavio
-- ----------------------------

-- ----------------------------
-- Table structure for `prijavljen`
-- ----------------------------
DROP TABLE IF EXISTS `prijavljen`;
CREATE TABLE `prijavljen` (
  `rbr` smallint(6) NOT NULL AUTO_INCREMENT,
  `ime` char(20) NOT NULL,
  `prezime` char(20) NOT NULL,
  `roditelj` char(20) NOT NULL,
  `jmbg` char(14) NOT NULL,
  `dan_rodjenja` smallint(6) NOT NULL,
  `mjesec_rodjenja` smallint(6) NOT NULL,
  `godina_rodjenja` smallint(6) NOT NULL,
  `mjesto_rodjenja` char(15) NOT NULL,
  `adresa` char(40) NOT NULL,
  `sifra_profila1` char(5) NOT NULL,
  `sifra_profila2` char(5) DEFAULT NULL,
  `sifra_profila3` char(5) DEFAULT NULL,
  `uspjeh_razred1` smallint(6) NOT NULL,
  `uspjeh_razred2` smallint(6) NOT NULL,
  `uspjeh_razred3` smallint(6) NOT NULL,
  `uspjeh_razred4` smallint(6) NOT NULL,
  `bodovi_prijemni` smallint(6) NOT NULL,
  `ukupno_bodova` double DEFAULT NULL,
  PRIMARY KEY (`rbr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of prijavljen
-- ----------------------------

-- ----------------------------
-- Table structure for `profesor`
-- ----------------------------
DROP TABLE IF EXISTS `profesor`;
CREATE TABLE `profesor` (
  `jmbg` char(14) NOT NULL,
  `ime` char(20) NOT NULL,
  `prezime` char(20) NOT NULL,
  `roditelj` char(20) NOT NULL,
  `radi_od_dan` smallint(6) NOT NULL,
  `radi_od_mjesec` smallint(6) NOT NULL,
  `radi_od_godina` smallint(6) NOT NULL,
  `staz` smallint(6) NOT NULL,
  `email` char(50) DEFAULT NULL,
  `telefon` smallint(6) DEFAULT NULL,
  `oblast_interesovanja` char(50) NOT NULL,
  PRIMARY KEY (`jmbg`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of profesor
-- ----------------------------

-- ----------------------------
-- Table structure for `profil`
-- ----------------------------
DROP TABLE IF EXISTS `profil`;
CREATE TABLE `profil` (
  `sifra_profila` char(5) NOT NULL,
  `naziv_profila` char(35) NOT NULL,
  PRIMARY KEY (`sifra_profila`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of profil
-- ----------------------------

-- ----------------------------
-- Table structure for `upis_godine`
-- ----------------------------
DROP TABLE IF EXISTS `upis_godine`;
CREATE TABLE `upis_godine` (
  `indeks` smallint(6) NOT NULL,
  `godina` smallint(6) NOT NULL,
  `godina_studija` smallint(6) NOT NULL,
  `put` smallint(6) NOT NULL,
  `dan_upisa` smallint(6) NOT NULL,
  `mjesec_upisa` smallint(6) NOT NULL,
  `godina_upisa` smallint(6) NOT NULL,
  PRIMARY KEY (`indeks`,`godina`,`godina_studija`,`put`),
  CONSTRAINT `upis_godine_ibfk_1` FOREIGN KEY (`indeks`, `godina`) REFERENCES `dosije` (`indeks`, `godina`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of upis_godine
-- ----------------------------
DROP TRIGGER IF EXISTS `insert_trigger1`;
DELIMITER ;;
CREATE TRIGGER `insert_trigger1` BEFORE INSERT ON `prijavljen` FOR EACH ROW set new.ukupno_bodova = (new.uspjeh_razred1+new.uspjeh_razred2+new.uspjeh_razred3+new.uspjeh_razred4)/4 + new.bodovi_prijemni
;;
DELIMITER ;
DROP TRIGGER IF EXISTS `update_trigger1`;
DELIMITER ;;
CREATE TRIGGER `update_trigger1` BEFORE UPDATE ON `prijavljen` FOR EACH ROW set new.ukupno_bodova = (new.uspjeh_razred1+new.uspjeh_razred2+new.uspjeh_razred3+new.uspjeh_razred4)/4 + new.bodovi_prijemni
;;
DELIMITER ;

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15502
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2346 Profil

icon Re: Pitanje iz MySQL-a15.04.2013. u 16:14 - pre 103 meseci
Citat:
zeko_sisko
Sto se tice izbora primarnih kljuceva, nije mi bas jasno zasto je izbor los,
ako vi i sami kazete da se primarni kljuc rijetko kada mijenja ili brise. Ja sam to pitao zbog jedne druge stvari, cisto da mi bude jasno.


mi nagadjamo cemu baza sluzi i kako ces je koristiti u odnosu na to sto pitas... neka generalna pravila su da ako ces menajti ikad primarni kljuc - izabrao si pogresno polje za primarni kljuc, dakle "update t set pk=nesto where stagod" je ispravan upit sintaksno ali je to uvek pogresno odabran pk, tj los db model, dakle ako ikad treba to da promenis ma koliko to bilo retko - pogresno je


Citat:
zeko_sisko:
Ja cu postaviti sada kompletan kod moje baze, pa ako neko bude imao vremena da pogleda i sugerise sta bih trebao izmjeniti, bio bih mu zahvalan.


meni se "naming convention" koji ti koristis ne svidja ni malo, nije jasan ..
ne svidja mi se sto koristis jmbg kao primarni kljuc i kao strani kljuc, prvo zato sto je ogroman, drugo jmbg vise nije ni tako jedinstven ni tako poseban, ima mnogo gresaka vezano za isti tako da je on jedinstven samo teoretski, dodatno imas problem stranih studenata koji doticni nemaju etc etc .. no mnogo je veci problem njegova velicina, mnogo je bolje da imas kljuc koji je bigint unsigned i koji vuces okolo a da ti je jmbg samo neki atribut u nekoj tabeli koji povuces to jednom godisnje sto ti treba za neki report
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3124

Jabber: djoka_l


+1328 Profil

icon Re: Pitanje iz MySQL-a17.04.2013. u 10:50 - pre 103 meseci
Evo, ja sam pogledao šta si uradio i daću ti sugestije. Nemoj da ih uzimaš previše srcu, ako ne želiš da pročitaš šta mislim, bolje odmah prekini sa čitanjem.


Da sam ja profesor, a ti da mi predaš ovakav rad, ja bih se dvoumio između najmanje prelazne ocene ili da te oborim sa konstatacijom "promašio temu".
To što si uradio je plod neiskustva (što ti ne zameram), ali ono što zameram je velika površnost.

Nisi odgovorio na ključno pitanje: Šta tvoj model predstavlja, odnosno šta tvoj program treba da radi???

Kada pogledam naslov, vidim "studentska evidencija", a kada pogledam u šemu baze ja vidim "studenstka evidencija", "prijava ispita", "prijemni ispit", "kadrovska evidencija", "raspored časova", a nijedna od tih oblasti nije ozbiljno obrađena.

Ajde prvo da krenemo sa tehničkim omaškama:

1. ne poznaješ DATE tip. Na svim mestima na kojem si razdvojio dan, mesec i godinu u tri smalint polja treba da stoji jedno polje tipa DATE.

2. ne poznaješ varchar tip podatka. char bi trebalo da bude fiksne dužine sa trailing blenkovima, a varchar promenljive dužine. Nije toliko bitno kod MySQL, ali se ponašanje char i varchar menjalo kroz verzije tako da bi tvoj softver mogao naprasno da prestane da radi sa promenom verzije baze. Samo bi jmbg mogao da bude char (i to char(13), a ne char(14) ), sve ostalo bi trebalo da bude tipa varchar.

Sada zamerke oblast po oblast:

1. Prijemni ispit

Imaš dve tabele, "kvota" i "prijavljen". GROZNO! Razmisli i reci u sebi na koja pitanja odgovara tabela kvota? Prvo, školska godina ti je smalint u više tabela. Raci koja je trenutno školska godina u toku? Rešenje: 2012/2013! Skoro svuda u svetu školske godine počinju u jednoj kalendarskoj godini, a završavaju se u drugoj. Zato je glupo ograničenje da ti je školska godina smalint. Sledeće, imamo kvotu i šta onda. Zar ne misliš da osim predviđenog broja za upis redovnih i vanrednih studenata postoji i stvarno upisan broj studenata. Zar misliš da se na svakom fakultetu popuni svaki profil? Problem - površnost. Treba da ispratiš ceo proces, a to nije samo kolika je bila predviđena kvota, nego koliko je i ostvareno.
Sledeća tabela prijavljen - opet površnost. Na mom fakultetu su bili prijemni ispiti iz dva predmeta, matematike i fizike, a uzimani su samo uspeh iz treće i četvtre godine srednje škole. Dakle, fale ti polja za broj bodova za svaki prijemni ponaosob, a imaš višak polja za uspeh iz škole. Ili možda nemaš. Pa onda ukupan broj bodova koji računaš u trigeru je jako loše rešenje. Pa onda opet površnost. Gde ti je veza između prijave i upisa. Oni koji su položili prijemni ispit i klasifikovali se za upis mogu da odustanu od upisa, a mogu da se i upišu.

2. Studentska evidencija

Opet dve tabele: "dosije" i "upis godine". E ovde sam skoro iskočio iz kože. Nazvati studenta dosijeom je vrhunac birokratije! Ali da pogledamo malo te dve tabele sa tehničke strane. Da li si ikada upisao godinu na fakultetu? Da li si popunjavao ŠV 20 obrazac? Gde su upisane vrednosti iz ŠV 20? Dakle, tvoja aplikacija ne radi studentsku evidenciju... Gde ti je veza između upisa godine i dosijea? Kako ti pada na pamet da je za adresu dovoljno jedno polje? Gde je poštanski broj i mesto? Šta ako je potrebno dve linije za adresu (primer Petar Petrović, Studentski dom Patris Lumumba, Neka ulica i neki broj, 11000 Beograd)?
Nesrećan izbor primarnog ključa (indeks, broj godine). Mada je malo verovatno da će ova kombinacija ikada da se promeni, malo mi je rogobatno da kroz gomilu tabela kao referencu vučem compound key. Bolja ideja je da se kreira ID koji će služiti za referenciranje, a da (indeks, broj godine) ostane samo u tabeli dosije i da bude dignut UNIQE INDEX nad njim.
Šta će ti u dosijeu naziv diplomskog i dan diplomiranja, a nemaš ocenu sa diplomskog. Ili stavi to sve (sa ocenom) u neku drugu tabelu ili promeni dosije. Zašto nemaš neki status. Da li student može da propusti neku godinu (recimo zbog bolesti)? Da li može da ne diplomira?

3. Prijava ispita

Dve tabele "prijavio" i "polagao" i nikakva veza između njih!!! Da li misliš da onaj ko je polagao ispit može da položi ili padne ili ne izađe, a onaj ko je polagao mora i da prijavi? Da li se igde u studentskoj evidenciji drži posebno ocena sa usmenog i pismenog posebno? Zašto ti služe polja ispitivač i profesor koje nemaju nikakve veze sa tabelom nastavnici. Šta će ti put koji možeš da dobiješ i kao count. Često ni student ne zna koji put prijavljuje neki ispit, a kako će tek znati ona tetka na šalteru, ako se tako prijavljuju ispiti. Ako ti to čak i treba, onda je bolje tu da se radi triger, nego na broju bodova na prijemnom.

4. Kadrovka evidencija

Jedna tabela "profesor". Ovu oblast zovem kadrovska evidencija zbog polja radni staz i radi od. Šta će ova polja u studentskoj evidenciji? I opet površnost, svuda gde je trebalo date polje, koristiš tri smalint polja, a samo za staž, gde je potrebno da imaš tri polja, ti imaš jedno. Ajde reci, kako ćeš da upišeš da profesor ima 12 godina 3 meseca i 18 dana prethodnog radnog staža u taj jedan smalint? Zar ne misliš da imaš i neka važnija polja koja nisi predvideo, tipa katedra (na kojoj katedri se profesor nalazi), zvanje (asistent, docent, vanredni profesor, redovni profesor, demonstrator) itd. JMBG, baš me interesuje šta ćeš da staviš za stranog predavača (a koristiš ga kao PK). Evo čitam da u Republici Srpskoj ove godine bebe još nisu dobile matične brojeve zbog nekih tehničkih pitanja u odnosima između RS i Federecije. Šta ćeš da uradiš kada bivše jugoslovenske republike odluče da promene način generisanja JMBG tako da osmi i deveti broj koji je nekad označavao republiku/region sada počnu da koriste po svom nahođenju. Šta ćeš da radiš kada ona tetka na šalteru mora da unese JMBG, a profesor ne zna isti pa ona stavi 13 jedinica, a kasnije se ipak dođe do ispravnog broja?

5. Raspored časova

Tabele nastava, plan, profil. Da li predviđaš da jedne školeke godine jedan profesor može da predaj jedan predmet, a druge godine drugi? Gde ti je istorijski podatak o školskoj godini? Primarni ključ - odvratan izbor. Recimo, ja sam u drugoj godini imao na mom profilu dvosemestarski predmet koji je drugom profilu bio jednosemestarski i to na četvrtoj godini. Isti profesor je predavao i nama i njima (u isto vreme u istoj učionici). Pošto je kod tebe primarni ključ profesor predmet, u tvom modelu profesor ne može da predaje isti predmet na dva profila. profil treba da ima id kao primarni ključ kao što smo već diskutovali. Šifra profila može da se menja ili ukine, id mora da bude veza. Mora da postoji poseban šifarnik predmeta, tabela predmet, a iz plan tabele izbaciti sifru predmeta i naziv predmeta, a staviti referencu na id iz tabele predmet. Tabela plan, fiksirao si da za predmet postoji neki fond časova za predavanja i vežbe. A gde su laboratorijske vežbe? A šta ako je predviđen i neki praktičan rad? A šta gde je broj bodova po Bolonji? U stvari šta će ti to? A da li si predvideo da jedan ili više profesora treba da drži predavanja, a jedan ili više asistenata vežbe? U tabeli nastava se ne vidi da li je u pitanju predavanje ili vežbe. A šta ako je grupa velika, pa recimo na profilu ima 40 studenata, a u laboratoriju stane 8, pa onda treba da bude 5 grupa kojima laboratorijske vežbe drže različiti asistenti ili laboranti ili demonstratori.


Puno je zamerki, moraš malo više da se potrudiš...
 
Odgovor na temu

[es] :: MySQL :: Pitanje iz MySQL-a

[ Pregleda: 2422 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

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