• Welcome to TUKE FÓRUM - Fórum pre študentov Technickej Univerzity v Košiciach.
 

DBS

Started by xxx3, 16.02.2012, 15:10:05

« predchdzajce - alie »

xxx3

nepodelil by sa niekto o to ako spravit tie vztahy ? ... nejak si myslim, zeby som spravil ale neviem ci dobre, kedze neviem ako vyskusat ci to mam dobre

Wolfdale

Vyskúšaj to tak, že vymaž niečo z tabuľky auto. Ak ti to zmizne v tabuľke auto, aj v tabuľke asz, máš to dobre.

Ešte sme to nedokončili celkom, ale takmer sme už začali.

xxx3

a tie vztahy tvorim len cez tie FOREIGN a PRIMARY KEY ? Ale aj nejak inak to treba poprepajat ?

Wolfdale

Ja som to riešil cez reference...

create table asz(
spz char(10) not null references auto(spz),
.
.
.
primary key(spz,kod_sluzby,datum_sluzby));


Máš teda spz v tabuľke asz, ktoré je prepojené s spz v tabuľke auto.
Ak vymažeš jedno, malo by sa vymazať aj to druhé.

Ešte sme to nedokončili celkom, ale takmer sme už začali.

xxx3

aha .. a cez foreign key si nerobil nic ? Lebo nasiel som na w3cschools dobre vysvetlene tie foreign keys a podla nich tvorenie  vtzahov .. ale zas tam som o reference nenasiel nic :D

Wolfdale

Cez FOREIGN KEY som nerobil nič...

Ešte poznámka k predošlému postu: spz sa vymaže v oboch tabuľkách len v prípade, ak tam pridáš on delete cascade

Ešte sme to nedokončili celkom, ale takmer sme už začali.

xxx3

a co tam je v tabulke ze typ serial ? .. to davas ako number ?

Rajo

Tabuľka sluzba
· hodnoty v stĺpci kod_sluzby sú autoincrement

create sequence s_sluzba ... alebo s_kod_sluzby ? názov tabulky alebo názov stĺpca ?

Wolfdale

To je logická schéma, kód robíš podľa fyzickej. Vo fyzickej máš všetko + dole máš ešte nejaké poznámky.

Ešte sme to nedokončili celkom, ale takmer sme už začali.

Wolfdale

Quote from: Rajo on  25.02.2012, 23:20:25
Tabuľka sluzba
· hodnoty v stĺpci kod_sluzby sú autoincrement

create sequence s_sluzba ... alebo s_kod_sluzby ? názov tabulky alebo názov stĺpca ?

create sequence s_kod_sluzby.

Ešte sme to nedokončili celkom, ale takmer sme už začali.

xxx3

ako s tym serial a money ? Number ?

Wolfdale

Hovorím že pozeraj fyzickú schému. Vo fyzickej tam máš number.

Ešte sme to nedokončili celkom, ale takmer sme už začali.

Rajo

Quote from: Tux on  25.02.2012, 23:21:16
Quote from: Rajo on  25.02.2012, 23:20:25
Tabuľka sluzba
· hodnoty v stĺpci kod_sluzby sú autoincrement

create sequence s_sluzba ... alebo s_kod_sluzby ? názov tabulky alebo názov stĺpca ?

create sequence s_kod_sluzby.

určite ? na cviku sme robili nejake tabulky so sekvenciou a dali sme s_nazov_tabulky ...nie názov stĺpca :) ale keď stĺpec tak stĺpec :P

Wolfdale

Nie, ja tak viem, že treba názov stĺpca. A tak mi to aj funguje správne.

Ešte sme to nedokončili celkom, ale takmer sme už začali.

veteran

Quote from: Rajo on  25.02.2012, 23:30:56
Quote from: Tux on  25.02.2012, 23:21:16
Quote from: Rajo on  25.02.2012, 23:20:25
Tabuľka sluzba
· hodnoty v stĺpci kod_sluzby sú autoincrement

create sequence s_sluzba ... alebo s_kod_sluzby ? názov tabulky alebo názov stĺpca ?

create sequence s_kod_sluzby.

určite ? na cviku sme robili nejake tabulky so sekvenciou a dali sme s_nazov_tabulky ...nie názov stĺpca :) ale keď stĺpec tak stĺpec :P
V podstate to máš jedno, ako si to pomenuješ. Keď budeš vkladať hodnoty to tabuľky, vložíš len volanie sekvencie s_evc.NEXTVAL. Mne to viac pasuje, keď má sekvencia rovnaké meno ako príslušný stĺpec tabuľky. Ale každý má iný vkus  ;) Tabuľka môže mať aj tak len jeden stĺpec s autoincrementom (ale dá sa to obísť).

RiTChi

Quote from: veteran on  26.02.2012, 10:16:13
Quote from: Rajo on  25.02.2012, 23:30:56
Quote from: Tux on  25.02.2012, 23:21:16
Quote from: Rajo on  25.02.2012, 23:20:25
Tabuľka sluzba
· hodnoty v stĺpci kod_sluzby sú autoincrement

create sequence s_sluzba ... alebo s_kod_sluzby ? názov tabulky alebo názov stĺpca ?

create sequence s_kod_sluzby.

určite ? na cviku sme robili nejake tabulky so sekvenciou a dali sme s_nazov_tabulky ...nie názov stĺpca :) ale keď stĺpec tak stĺpec :P
V podstate to máš jedno, ako si to pomenuješ. Keď budeš vkladať hodnoty to tabuľky, vložíš len volanie sekvencie s_evc.NEXTVAL. Mne to viac pasuje, keď má sekvencia rovnaké meno ako príslušný stĺpec tabuľky. Ale každý má iný vkus  ;) Tabuľka môže mať aj tak len jeden stĺpec s autoincrementom (ale dá sa to obísť).

Odkial vlastne databaza vie, ktory stlpec inkrementovat? Podla PRIMARY KEY? Asi tomu nerozumiem celkom dobre.

veteran

Quote from: RiTChi on  26.02.2012, 11:17:06
Odkial vlastne databaza vie, ktory stlpec inkrementovat? Podla PRIMARY KEY? Asi tomu nerozumiem celkom dobre.

Databáza to vie podľa sekvencie, ktorú si nastavíš. V našom prípade:

Máme tabuľku sluzba:
create table sluzba(
   kod_sluzby .......................,
   nazov_sluzby .......................,
   cena_sluzby .......................,
   ..............................................
);


a sekvenciu:
create sequence s_kod_sluzby
   start with 1
   increment by 1;


Teda, máme vytvorenú tabuľku, zatiaľ v nej nie sú žiadne údaje. Skúsime ich tam vložiť (INSERT budeme riešiť tento týždeň):
insert into sluzba(kod_sluzby,nazov_sluzby,cena_sluzby) values(
s_kod_sluzby.NEXTVAL,
'vymena oleja',
86.99);


A pozrime si výstup:
select * from sluzba;
Quote
KOD_SLUZBY NAZOV_SLUZBY         CENA_SLUZBY
---------- -------------------- -----------
         1 vymena oleja               86,99

Databáza zistila, že v tabuľke nemáme nič. V sekvencii máme nastavené, že začíname od jednotky (start with 1). Teraz vložme druhý údaj (druhú zákazku/službu):
insert into sluzba(kod_sluzby,nazov_sluzby,cena_sluzby) values(
s_kod_sluzby.NEXTVAL,
'vymena pneu',
45.26);


A checknime výstup:
select * from sluzba;
QuoteKOD_SLUZBY NAZOV_SLUZBY         CENA_SLUZBY
---------- -------------------- -----------
         2 vymena pneu                45,26
         1 vymena oleja               86,99

Databáza zistila, že v tabuľke máme zákazku s ev. č. 1 a keďže v sekvencii máme nastavené inkrementovanie po jednej, tak ďalšiemu riadku tabuľky (zákazke/službe) priradí dvojku.

O primary key napíšem do ďalšieho príspevku.

veteran

#42
Primary key

To je nejaký primárny kľúč tabuľky, teda stĺpec tabuľky, kde v každom riadku bude jedinečný údaj. V tabuľke sluzba to je stĺpec evc. Každá zákazka/služba bude mať svoje vlastné evidenčné číslo.

Alebo iný príklad. Predstav si db na matrike. Každý človek dostane po narodení svoje rodné číslo, ktoré je jedinečné. Neexistujú dvaja ľudia s rovnakým RČ. Teda v db na matrike je nejaký stĺpec rodne_cislo a je na 100% nastavený ako primary_key. Ak by sme sa tam pokúsili vložiť človeka s rodným číslom, ktoré je už obsadené, vypísalo by to chybu Duplicate entry '......' for key 'PRIMARY' (resp. niečo podobné - toto je hláška z MySQL. Oracle má možno inú. Môžeš si to skúsiť na svojej databáze a uvidíš, čo to bude hlásiť :))

EDIT: No, takže Oracle hádže pri duplicite niečo takéto:
ERROR v riadku 1:
ORA-00001: unique constraint (TvojLogin.SYS_C00243949) violated


Viac o tejto chybe: http://www.dba-oracle.com/sf_ora_00001_unique_constraint_violated.htm

xxx3

sekvencia je na to inkrementovanie, hej ? A vztahy nemaju nic spolocne so sekvenciou, ci? 

veteran

Quote from: xxx3 on  26.02.2012, 11:58:52
sekvencia je na to inkrementovanie, hej ?
Áno. V MySQLku je to lepšie, tam je auto_increment číslo uložené priamo v tabuľke a vôbec sa oňho nestaráš. V Oracle DB si urobíš sekvenciu a potom pri vkladaní údajov do tabuľky ju zavoláš (s_kod_sluzby.NEXTVAL), aby ti inkrementla hodnotu a vložila ju do príslušného stĺpca.

Quote from: xxx3 on  26.02.2012, 11:58:52A vztahy nemaju nic spolocne so sekvenciou, ci?
Nemyslím, žeby to spolu nejako súviselo.

Foreign keys slúžia na to, aby databáza vedela dať do súvisu údaje. Napr.: v tabuľke auto máme poznamenanú ŠPZku. Je to PRIMARY KEY - nechceme, aby sme mali v tejto tabuľke nejaké auto dvakrát. ŠPZku máme aj v tabuľke asz. ŠPZ v tabuľke auto je "parent" a ŠPZ v tabuľke asz "child". Na základe tohto vzťahu si vieme zistiť, že auto s nejakou ŠPZkou malo toho a toho dňa takú a takú opravu. Pomocou ďalších vzťahov, ktoré sú v tej schéme predpísané vieme zistiť aj koľko tá oprava stála a kto túto zákazku prijal. To všetko sa dá vypísať do jednej peknej tabuľky pomocou príkazov JOIN, INNER JOIN, LEFT JOIN (ešte o nich bude reč na cvičeniach).

Existujú tri druhy vzťahov - 1:1, 1:n a m:n.

Popíšem na príkladoch.
Vzťah 1:1 - to je napr. vzťah muž:žena. V našej kultúre je zrejmé, že jedna žena má len jedného muža a naopak. Dá sa to aplikovať aj na školu - teda napr. učiteľ je/môže byť triedny len jednej triede a opačne - nejaká trieda má len jedného triedneho učiteľa.
Vzťah 1:n - to je prípad nášho autoservisu na všetkých troch vzťahoch. Jedno auto môže mať v db zapísaných viacero opráv. Jeden zamestnanec môže mať v db zapísaných viacero prijatých zákaziek (no však bodaj by aj nie, ináč by taký autoservis veľmi rýchlo skrachoval  ;D).
Vzťah m:n - toto je prípad vzťahu viac:viac. Teda napr. v škole - každý učiteľ učí veľa žiakov a každý jeden žiak chodí na rôzne hodiny ku viacerým učiteľom.

Sekvencie slúžia čisto len na inkrementáciu hodnôt pri vkladaní údajov do tabuliek.

Heh, som sa nejako rozpísal, tak snáď to niekto dočíta do konca  ;D

xxx3

diky za to rozpisanie, mne to pomohlo

RiTChi

Yeah! ^^ Vdaka veteran, normalne sa oplatilo byt za blbeho a opytat sa :D

xxx3

a toto, veteran ... ked je podmienka, ze hodnota v stĺpci cena_sluzby je vždy väčšia ako 0

tak to dam len na koniec tabulky ze CHECK (cena_sluzby>0)  ?  .. elbo niekde som nasiel tak podobnu podmienku, ze constraint cena_sluzby_check CHECK (cena_sluzby>0) ...

veteran

#48
Quote from: RiTChi on  26.02.2012, 13:00:48
Yeah! ^^ Vdaka veteran, normalne sa oplatilo byt za blbeho a opytat sa :D
nz  :) Radšej sa spýtať a byť blbý raz, ako sa nespýtať a byť blbý navždy  ;)

Quote from: xxx3 on  26.02.2012, 13:24:29
a toto, veteran ... ked je podmienka, ze hodnota v stĺpci cena_sluzby je vždy väčšia ako 0

tak to dam len na koniec tabulky ze CHECK (cena_sluzby>0)  ?  .. elbo niekde som nasiel tak podobnu podmienku, ze constraint cena_sluzby_check CHECK (cena_sluzby>0) ...
Más zrejme na mysli dopyt:
alter table sluzba add constraint cena_sluzby_check CHECK (cena_sluzby>0);

Toto použiješ, keď si CHECK nenastavil pri prvotnej definícii tabuľky. Prípadne, keď potrebuješ zmeniť nejakú podmienku, resp.  nejakú pridať, odobrať a pod.  ;) Volá sa to Out-of-line constraint - integritné obmedzenie vložené do definície tabuľky.

gareth

Kto ma zauje .. zadanie PM