Autor Téma: Cudzí kľúč verzus join  (Přečteno 2408 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2996
  • Karma: 29
    • Verze Delphi: XE7 professional
Cudzí kľúč verzus join
« kdy: 27-04-2015, 15:57:55 »
Snažím sa urobiť program pre správu SVB. Moja úvaha bola:

"Vždy budem robiť s konkrétnym SVB. Preto v niektorých prípadoch je pre mňa jednoduchšie dať do tabuľky cudzí kľúč FKSVB, než vytvárať join cez niekoľko tabuliek."

K tomu pristupuje aj filtrovanie tabuliek. Napr. ak chcem vybrať byty v danom SVB, tak mi stačí nastaviť na tabuľke BYTY.Filter := 'FKSVB=xy';
Tak som si FKSVB nahádzal do všetkých tabuliek. Viem, že to porušuje pravidlá relačnej DB (norma...?).

Je moja úvaha opodstatnená, alebo
  1) mám vždy tvrdo pracovať s join 
  2) použiť kompromis a FKSVB definovať len tam kde sa využije. Len neviem ako to bude v budúcnosti.

Ďakujem za názory.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1866
  • Karma: 91
    • Verze Delphi: D2007, XE3, DX10
Re:Cudzí kľúč verzus join
« Odpověď #1 kdy: 27-04-2015, 16:08:09 »
"Vždy budem robiť s konkrétnym SVB. Preto v niektorých prípadoch je pre mňa jednoduchšie dať do tabuľky cudzí kľúč FKSVB, než vytvárať join cez niekoľko tabuliek."
Vubec ti nerozumim ;-)

Byt prece muze v dany okamzik patrit jednomu SVB, takze ma relaci OneToMany, kterou udelas tak, ze das k bytu FK na SVB
a takova data skutecne zapises do DB.

Pri dotazu pokud znas hodnotu toho FK, tak ti staci napsat where FK=:FK, jinak musis to SVB pripojit joinem...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2996
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Cudzí kľúč verzus join
« Odpověď #2 kdy: 27-04-2015, 16:17:23 »
Trocha to rozpíšem. Ten byt je celkom dobrý príklad. Štruktúra/väzby je
SVB -> Blok -> Vchod -> Byt.

Nedám do tabuľky BYT cudzí kľúč FKSVB. Musím vytvoriť SQL/Pohľad a použiť join spätne až k Tabuľke SVB (3 kusy) a potom WHERE IDSVB = xy. Prísne dodržiavam normalizáciu. V niektorých prípadoch ten join môže byť celkom zložitý.

Z môjho pohľadu je jednoduchšie nadefinovať si FKSVB. Až taký veľký nárast DB to nespôsobí. Vzhľadom na skutočnosť, že neviem čo bude zajtra, tak som to natrepal všade.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 568
  • Karma: 23
Re:Cudzí kľúč verzus join
« Odpověď #3 kdy: 27-04-2015, 20:48:17 »
Z môjho pohľadu je jednoduchšie nadefinovať si FKSVB. Až taký veľký nárast DB to nespôsobí. Vzhľadom na skutočnosť, že neviem čo bude zajtra, tak som to natrepal všade.

Jakože SVB máš ve třech tabulkách (blok, vchod, byt) místo v jedné? To je blbě z hlediska návrhu db, z hlediska praxe se to může dělat pokud člověk narazí na problém s výkonem. Nicméně pochybuji, že někde provozujete systém s miliony záznamů, aby se to vůbec projevilo. Kolik dat tam reálně máte? V joinu přes pár tabulek bych problém neviděl. Jestli je jediný důvod to, že jsi líný to tam psát, tak bych to nedělal.

Ještě budeš mít problém, pokud bys chtěl měnit id SVB, pak bys to musel změnit ve všech tabulkách. Ale to prakticky asi dělat nebudeš...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2996
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Cudzí kľúč verzus join
« Odpověď #4 kdy: 28-04-2015, 07:28:25 »
Citace
Jakože SVB máš ve třech tabulkách (blok, vchod, byt) místo v jedné?
Ak tým myslíš FKSVB (cudzí kľúč), tak áno. Samotné údaje nikde nezdvojujem!
Citace
To je blbě z hlediska návrhu db
Preto som založil tému.
Citace
Nicméně pochybuji, že někde provozujete systém s miliony záznamů, aby se to vůbec projevilo.
To naozaj nehrozí. Teraz mi ide čiste o metodiku.
Citace
Jestli je jediný důvod to, že jsi líný to tam psát, tak bych to nedělal.
Skoro  :), ale
  • môže to byť zložité
  • nepracujem priamo s tabuľkou. Filter áno
  • vždy si musím vytvoriť nejaký dataset
  • Ak budem chcieť hromadne spracovať nejaké údaje za SVB, tak mi stačí použiť FKSVB v patričnej/ých tabuľke
Citace
Ještě budeš mít problém, pokud bys chtěl měnit id SVB, pak bys to musel změnit ve všech tabulkách. Ale to prakticky asi dělat nebudeš...
To neprichádza do úvahy! Buď tam SVB bude "komplet", alebo nič. Mám v pláne, od určitého stupňa zadania údajov, namiesto vymazania údajov použiť príznak vymazania.

Mám dojem, že som si to náležite vysvetlil. Kloním sa k
Citace
2) použiť kompromis a FKSVB definovať len tam kde sa využije.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 568
  • Karma: 23
Re:Cudzí kľúč verzus join
« Odpověď #5 kdy: 28-04-2015, 10:08:40 »
Citace
Jakože SVB máš ve třech tabulkách (blok, vchod, byt) místo v jedné?
Ak tým myslíš FKSVB (cudzí kľúč), tak áno. Samotné údaje nikde nezdvojujem!

Zdvojuješ. FK je sloupec nebo skupina sloupců, u kterých se řekne, že jejich hodnota je PK v nějaké jiné tabulce. Jenže ty máš to id na bytu, vchodu i domu, přitom to stačí na domu, protože u vchodu je vazba na dům, tak je zbytečné tam mít ještě vazbu na SVB.

Ještě se může stát, že v jednom domě i vchodě bude víc právních subjektů, třeba část bytů v družstevním vlastnictví a část už v osobním, nebo se dlouhý dům rozdělí a bude víc SVB (v češtině SVJ). Takže nakonec to asi ani blbě není, ale na vchodu by vazba na SVB být asi neměla (byty mohou být v různém) a v domě může být víc SVB.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2996
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:Cudzí kľúč verzus join
« Odpověď #6 kdy: 28-04-2015, 11:22:25 »
Citace
Zdvojuješ. FK je sloupec nebo skupina sloupců, u kterých se řekne, že jejich hodnota je PK v nějaké jiné tabulce. Jenže ty máš to id na bytu, vchodu i domu, přitom to stačí na domu, protože u vchodu je vazba na dům, tak je zbytečné tam mít ještě vazbu na SVB.
Takto zdvojujem.
Citace
Ještě se může stát, že v jednom domě i vchodě bude víc právních subjektů,...
Ale ja neriešim túto problematiku. Predstav si akúkoľvek inú DB a v nej popísanú úvahu.

Ja si na úkor zdvojenia údajov a tým porušenia normalizácie DB zľahčujem úlohu. S lenivosťou to nemá nič spoločné - určite to nie je dôvod. Ide mi hlavne o
- zjednodušenie práce
- zníženie možnosti urobenia chyby

Praktický príklad využitia:
Mám na formulári combobox so zoznamom SVB. Podľa vybraného SVB zobrazujem v tabuľke patričné údaje (akékoľvek). Ak dodržím pravidla normalizácie, tak:

1) Musím získať DataSet pomocou "SELECT cl1, cl2, ... FROM T1  JOIN ... ON ...  WHERE podmienka". Pričom prepojenie tabuliek môže byť dosť zložité a komplikované
2) Pri akejkoľvek práci sa konkrétnou tabuľkou musím identifikovať požadované záznamy pomocou JOIN.

Pri zdvojení údaju IDSVB = FKSVB
1) Pracujem priamo s tabuľkou za pomoci filtra "FKSVB=hodnota"
2) Stačí mi podmienka WHERE FKSVB=hodnota

Prikladám väzby v DB, bez spojení IDCFO - FKCFO. Bolo by to neprehľadné. Nie je to ešte celá DB.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Dejfik

  • Nováček
  • *
  • Příspěvků: 14
  • Karma: 1
    • Verze Delphi: D2010
Re:Cudzí kľúč verzus join
« Odpověď #7 kdy: 30-04-2015, 14:17:24 »
Nevím, jak tvůj formulář vypadá, ale píšeš, že po výběru data pouze zobrazuješ.
Pak bych doporučil nedávat cizí klíče do dalších tabulek, ale nechat jej pouze v jedné (kde je to potřeba) a vytvořit si v DB pohledy, které Ti ty joiny zajistí a tím budeš moci jednoduše filtrovat.

Ale možná jsem pochopil tvůj dotaz špatně.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: