Author Topic: DBS  (Read 49643 times)

xxx3

  • Hero Member
  • *****
  • Posts: 1010
    • View Profile
Re: DBS
« Reply #25 on: 25.02.2012, 21:04:43 »
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

  • Global Moderator
  • Sr. Member
  • *****
  • Posts: 489
  • /root
    • View Profile
Re: DBS
« Reply #26 on: 25.02.2012, 21:07:47 »
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

  • Hero Member
  • *****
  • Posts: 1010
    • View Profile
Re: DBS
« Reply #27 on: 25.02.2012, 21:43:00 »
a tie vztahy tvorim len cez tie FOREIGN a PRIMARY KEY ? Ale aj nejak inak to treba poprepajat ?

Wolfdale

  • Global Moderator
  • Sr. Member
  • *****
  • Posts: 489
  • /root
    • View Profile
Re: DBS
« Reply #28 on: 25.02.2012, 21:48:58 »
Ja som to riešil cez reference...

Code: [Select]
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

  • Hero Member
  • *****
  • Posts: 1010
    • View Profile
Re: DBS
« Reply #29 on: 25.02.2012, 21:50:17 »
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

  • Global Moderator
  • Sr. Member
  • *****
  • Posts: 489
  • /root
    • View Profile
Re: DBS
« Reply #30 on: 25.02.2012, 21:52:58 »
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

  • Hero Member
  • *****
  • Posts: 1010
    • View Profile
Re: DBS
« Reply #31 on: 25.02.2012, 22:06:43 »
a co tam je v tabulke ze typ serial ? .. to davas ako number ?

Rajo

  • Sr. Member
  • ****
  • Posts: 346
    • View Profile
Re: DBS
« Reply #32 on: 25.02.2012, 22: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 ?

Wolfdale

  • Global Moderator
  • Sr. Member
  • *****
  • Posts: 489
  • /root
    • View Profile
Re: DBS
« Reply #33 on: 25.02.2012, 22:20:35 »
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

  • Global Moderator
  • Sr. Member
  • *****
  • Posts: 489
  • /root
    • View Profile
Re: DBS
« Reply #34 on: 25.02.2012, 22:21:16 »
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

  • Hero Member
  • *****
  • Posts: 1010
    • View Profile
Re: DBS
« Reply #35 on: 25.02.2012, 22:22:39 »
ako s tym serial a money ? Number ?

Wolfdale

  • Global Moderator
  • Sr. Member
  • *****
  • Posts: 489
  • /root
    • View Profile
Re: DBS
« Reply #36 on: 25.02.2012, 22:24:10 »
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

  • Sr. Member
  • ****
  • Posts: 346
    • View Profile
Re: DBS
« Reply #37 on: 25.02.2012, 22:30:56 »
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

  • Global Moderator
  • Sr. Member
  • *****
  • Posts: 489
  • /root
    • View Profile
Re: DBS
« Reply #38 on: 25.02.2012, 22:35:03 »
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

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DBS
« Reply #39 on: 26.02.2012, 09:16:13 »
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

  • Full Member
  • ***
  • Posts: 218
    • View Profile
Re: DBS
« Reply #40 on: 26.02.2012, 10:17:06 »
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

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DBS
« Reply #41 on: 26.02.2012, 10:29:19 »
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;
Quote
KOD_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

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DBS
« Reply #42 on: 26.02.2012, 10:34:04 »
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
« Last Edit: 26.02.2012, 10:39:43 by veteran »

xxx3

  • Hero Member
  • *****
  • Posts: 1010
    • View Profile
Re: DBS
« Reply #43 on: 26.02.2012, 10:58:52 »
sekvencia je na to inkrementovanie, hej ? A vztahy nemaju nic spolocne so sekvenciou, ci? 

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DBS
« Reply #44 on: 26.02.2012, 11:24:00 »
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.

A 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

  • Hero Member
  • *****
  • Posts: 1010
    • View Profile
Re: DBS
« Reply #45 on: 26.02.2012, 11:42:52 »
diky za to rozpisanie, mne to pomohlo

RiTChi

  • Full Member
  • ***
  • Posts: 218
    • View Profile
Re: DBS
« Reply #46 on: 26.02.2012, 12:00:48 »
Yeah! ^^ Vdaka veteran, normalne sa oplatilo byt za blbeho a opytat sa :D

xxx3

  • Hero Member
  • *****
  • Posts: 1010
    • View Profile
Re: DBS
« Reply #47 on: 26.02.2012, 12: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) ...

veteran

  • Hero Member
  • *****
  • Posts: 956
    • View Profile
Re: DBS
« Reply #48 on: 26.02.2012, 12:36:40 »
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  ;)

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.
« Last Edit: 26.02.2012, 12:38:33 by veteran »

gareth

  • Newbie
  • *
  • Posts: 12
    • View Profile
Re: DBS
« Reply #49 on: 27.02.2012, 11:23:18 »
Kto ma zauje .. zadanie PM