MySQL - podmíněný SELECT přes dvě tabulky

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #135 kdy: 20. 10. 2019, 19:01:06 »
Citace
se zadáním „vedoucí je definován tím, že má podřízené
  • Zadání je evidentně defunkční.
  • Je tedy v podstatě skoro jisté, že bude změněno.
  • A proto je tedy správné aplikaci připravit i na Tebou zmíněnou eventualitu, která nyní dle zadání nemůže nastat.
  • To, že je aplikace na něco připravená (např. vhodnou strukturou DB) neznamená, že aktuální implementace něco porušuje.
Který z těchto bodů nechápeš?


Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #136 kdy: 20. 10. 2019, 19:23:45 »
Zadání je funkční. Pokud se vám na něm něco nezdá, můžete zadání rozporovat. Pokud proti zadání nemáte žádné námitky, ale navrhnete řešení, které je v rozporu se zadáním, je to vaše chyba. Co na tom nechápete?

Pořád jenom kličkujete. Zadání bylo „vedoucí zaměstnanec je definován tím, že má podřízené“. Na to Miroslav Šilhavý odpověděl: „můžu chtít zobrazit všechny vedoucí, […] co (už) žádné podřízené nemají“. To tvrzení buď je v souladu se zadáním, nebo je s ním v rozporu. Žádná třetí možnost neexistuje. Vy, místo abyste napsal, zda je v souladu nebo v rozporu, pořád jen vymýšlíte další a další výmluvy. Jak chcete hodnotit funkčnost či nefunkčnost zadání, když nedokážete odpovědět ani na takhle jednoduchou otázku?

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #137 kdy: 20. 10. 2019, 20:29:24 »
Aha, takže „případ, kdy vedoucí nemá žádné podřízené“ je zcela v souladu se zadáním „vedoucí je definován tím, že má podřízené“. Omlouvám se, této vaší logice opravdu nerozumím – a ani rozumět nechci.

Tak pak se možná zdržujte radit nováčkům. Ti třeba budou ochotní rozumět.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #138 kdy: 20. 10. 2019, 21:02:24 »
Tak pak se možná zdržujte radit nováčkům. Ti třeba budou ochotní rozumět.
Je možné, že někteří nováčci budou rozumět tomu, že mohou zadání ignorovat a bez varování psát podle jiného zadání, které si sami vytvořili a s nikým ho nekonzultovali. Ovšem pak je potřeba je před takovým počínáním důrazně varovat.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #139 kdy: 20. 10. 2019, 21:12:37 »
Je možné, že někteří nováčci budou rozumět tomu, že mohou zadání ignorovat a bez varování psát podle jiného zadání, které si sami vytvořili a s nikým ho nekonzultovali. Ovšem pak je potřeba je před takovým počínáním důrazně varovat.

Vyvozujete něco, co tu nezaznělo a podsouváte to.

Programátor by měl mít nastartované kritické myšlení a měl by tyto situace domyslet. Zadavateli by je měl samozřejmě předložit, pokud vybočí ze zadání. Neznám však zadavatele, který by dal tak rigidní pokyn, jako že "vedoucí je pouze ten, který má podřízené". Většinou je zadání obecnou větou: "vedoucí se pozná tak, že má podřízené", což si musíte v obecné mluvě přeložit. Zadavatel je neprogramátor, věta pak znamená "vedoucí (se obvykle) pozná podle toho, že má podřízené".

Na programátorovi (analytikovi) je umět tyto nuance rozlišit. V obou případech, které jsme zde probírali, nevybočuje programátor ze zadání, pouze domyslel existenci hraničních stavů. Následně může přidat filtr, který to omezí na úroveň striktního požadavku - a ve chvíli, kdy se ukáže, že to zadavatel nedomyslel, nemusí celou databázi překopávat a revidovat kód, aby každý dotaz od píky přeformulovál.


Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #140 kdy: 20. 10. 2019, 22:14:06 »
Vyvozujete něco, co tu nezaznělo a podsouváte to.

Programátor by měl mít nastartované kritické myšlení a měl by tyto situace domyslet. Zadavateli by je měl samozřejmě předložit, pokud vybočí ze zadání. Neznám však zadavatele, který by dal tak rigidní pokyn, jako že "vedoucí je pouze ten, který má podřízené". Většinou je zadání obecnou větou: "vedoucí se pozná tak, že má podřízené", což si musíte v obecné mluvě přeložit. Zadavatel je neprogramátor, věta pak znamená "vedoucí (se obvykle) pozná podle toho, že má podřízené".

Na programátorovi (analytikovi) je umět tyto nuance rozlišit. V obou případech, které jsme zde probírali, nevybočuje programátor ze zadání, pouze domyslel existenci hraničních stavů. Následně může přidat filtr, který to omezí na úroveň striktního požadavku - a ve chvíli, kdy se ukáže, že to zadavatel nedomyslel, nemusí celou databázi překopávat a revidovat kód, aby každý dotaz od píky přeformulovál.
Nic vám nepodsouvám. Vy se pořád jen vymlouváte. Že by to takhle normálně zadavatel nezadal? Zaprvé je to jen vaše domněnka, za druhé tady to takhle napsané bylo, tak jste na to měl odpovídajícím způsobem reagovat. Pokud byste zapnul kritické myšlení, musel byste dospět k tomu, že vaše odpověď je v rozporu se zadáním a vy to nijak neřešíte.

Navíc popisujete domýšlivé chování analytika, před kterým je potřeba každého začátečníka varovat. Pokud si analytik není něčím jistý, má se na to zadavatele doptat. Pokud někdo řekne „vedoucí se pozná tak, že má podřízené“, možná také očekává, že to aplikace bude kontrolovat a nedovolí z někoho udělat vedoucího (nebo třeba „šéfa“, ať si to Logik zase neplete s vedoucím zaměstnancem). Ale vy jste mu právě tuhle kontrolu z aplikace odstranil, protože si myslíte, že všechno víte nejlíp a zadání si proto klidně můžete přeformulovat, jak vás napadne.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #141 kdy: 20. 10. 2019, 22:32:06 »
Pokud někdo řekne „vedoucí se pozná tak, že má podřízené“, možná také očekává, že to aplikace bude kontrolovat a nedovolí z někoho udělat vedoucího (nebo třeba „šéfa“, ať si to Logik zase neplete s vedoucím zaměstnancem). Ale vy jste mu právě tuhle kontrolu z aplikace odstranil, protože si myslíte, že všechno víte nejlíp a zadání si proto klidně můžete přeformulovat, jak vás napadne.

Čímž jste se dopustil katastrofální chyby. Vazba bude buďto přímo zaměstnanec => nadřízený, nebo v případě příslušnosti zaměstnance ve více týmech (stává se!) by byla přes dynamickou vazbu zaměstnanec <= vazba => nadřízený. V obou případech vede FK směrem k nadřízenému, tedy na straně entity nadřízeného nemáte jaké pravidlo kontrolovat (maximálně CHECK, který se ovšem nevyvolá při ztrátě vazby - takže je k ničemu), natož aby bylo deferovatelné v době vzniku té vazby. Dál byste musel vyžadovat, aby entita zaměstnance existovala dřív, než entita nadřízeného - což je další úvaha zcela mimo praxi. Sakra, kdo to tu o pár postů výše hlásal, že databáze má zachycovat realitu, nikoliv stav vytvořený rozhodnutím? A jo, Vy. Tím se netrapte, já taky plácám blbosti.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #142 kdy: 20. 10. 2019, 23:53:04 »
Vedoucí vede oddělení, podřízené mít nemusí.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #143 kdy: 21. 10. 2019, 07:43:15 »
Čímž jste se dopustil katastrofální chyby. Vazba bude buďto přímo zaměstnanec => nadřízený, nebo v případě příslušnosti zaměstnance ve více týmech (stává se!) by byla přes dynamickou vazbu zaměstnanec <= vazba => nadřízený. V obou případech vede FK směrem k nadřízenému, tedy na straně entity nadřízeného nemáte jaké pravidlo kontrolovat (maximálně CHECK, který se ovšem nevyvolá při ztrátě vazby - takže je k ničemu), natož aby bylo deferovatelné v době vzniku té vazby. Dál byste musel vyžadovat, aby entita zaměstnance existovala dřív, než entita nadřízeného - což je další úvaha zcela mimo praxi. Sakra, kdo to tu o pár postů výše hlásal, že databáze má zachycovat realitu, nikoliv stav vytvořený rozhodnutím? A jo, Vy. Tím se netrapte, já taky plácám blbosti.
Ano, dopustil jsem se katastrofální chyby, když jsem předpokládal, že vývoji software alespoň trochu rozumíte.

Aplikace musí kontrolovat spoustu dalších věcí, ne jen ty, které lze v databázi vyjádřit jako cizí klíče. A zrovna vazbu „má podřízené“, pokud ji chcete kontrolovat vůči příznaku „je nadřízený“, můžete kontrolovat i v databázi, například pomocí triggeru. V mém příkladu ale nebyla taková kontrola potřeba, protože já jsem nenavrhoval žádný příznak „má nadřízené“ uložený v databázi – já jsem vycházel přímo z definice, že nadřízený je ten, kdo má podřízené, takže ten příznak byl vypočítáván v okamžiku, kdy byl potřeba.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #144 kdy: 21. 10. 2019, 09:36:16 »
Aplikace musí kontrolovat spoustu dalších věcí, ne jen ty, které lze v databázi vyjádřit jako cizí klíče. A zrovna vazbu „má podřízené“, pokud ji chcete kontrolovat vůči příznaku „je nadřízený“, můžete kontrolovat i v databázi, například pomocí triggeru. V mém příkladu ale nebyla taková kontrola potřeba, protože já jsem nenavrhoval žádný příznak „má nadřízené“ uložený v databázi – já jsem vycházel přímo z definice, že nadřízený je ten, kdo má podřízené, takže ten příznak byl vypočítáván v okamžiku, kdy byl potřeba.

Pokud je to kontrola v aplikaci, pak to není možno v pravém smyslu považovat za integritní omezení dat.

Triggerem to hlídat můžete pouze za předpokladu, že budete mít nadřízeného v databázi označeného takovým příznakem. Jinak by trigger nemohl vyhodnotit, který nadřízený musí mít podřízené. V tu chvíli jste na půdě návrhu, o kterém hovořil Logik - tedy musíte mít v datech nadřízeného označeného, nikoliv to vyvozovat z existence vazby.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #145 kdy: 21. 10. 2019, 12:34:51 »
To je jak besídka zvláštní školy…

Pokud je to kontrola v aplikaci, pak to není možno v pravém smyslu považovat za integritní omezení dat.
Za prvé to stejně tak je možné považovat za v pravém smyslu integritní omezení dat – můžete např. data zpřístupnit jen přes nějaké API, jehož implementace teprve bude komunikovat s databází, nikdo jiný přímo do databáze nepoleze. Za druhé, o integritním omezení dat píšete vy, já jsem psal o zadání. To je pořád ten váš velmi zúžený pohled, kdy se díváte jen na databázi a nevidíte nic okolo.

Triggerem to hlídat můžete pouze za předpokladu, že budete mít nadřízeného v databázi označeného takovým příznakem.
Ano, právě na ten případ, kdy máte nějaký příznak v databázi, jsem reagoval.

Jinak by trigger nemohl vyhodnotit, který nadřízený musí mít podřízené. V tu chvíli jste na půdě návrhu, o kterém hovořil Logik - tedy musíte mít v datech nadřízeného označeného, nikoliv to vyvozovat z existence vazby.
Když to odvozujete online z existence vazby, jak byl můj původní návrh, nemáte zase co kontrolovat, protože ta vazba prostě ten stav „vedoucí“ rovnou definuje.

Vaše komentáře už jsou jenom trapné, snažíte se hledat chyby za každou cenu, ale už je nacházíte akorát u sebe. Já napíšu „původně jsem psal o variantě A, ale vaše varianta B by se řešila takhle“, a vy na to odpovíte, že ale to řeší variantu B a varianta A by se musela řešit jinak.

Jestli na to budete reagovat zase nějakým dalším ještě bláznivějším komentářem, s mojí odpovědí už nepočítejte.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #146 kdy: 21. 10. 2019, 13:38:33 »
Jestli na to budete reagovat zase nějakým dalším ještě bláznivějším komentářem, s mojí odpovědí už nepočítejte.

Já myslím, že to v klidu můžeme zakončit. Řekli jsme si o 99 % víc, než bylo potřeba.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #147 kdy: 21. 10. 2019, 14:28:36 »
Pokud je to kontrola v aplikaci, pak to není možno v pravém smyslu považovat za integritní omezení dat.
Za prvé to stejně tak je možné považovat za v pravém smyslu integritní omezení dat – můžete např. data zpřístupnit jen přes nějaké API, jehož implementace teprve bude komunikovat s databází, nikdo jiný přímo do databáze nepoleze.

Nejlepším databázovým API je SQL.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #148 kdy: 21. 10. 2019, 14:30:30 »
Nejlepším databázovým API je SQL.

Amen.

Re:MySQL - podmíněný SELECT přes dvě tabulky
« Odpověď #149 kdy: 21. 10. 2019, 14:47:12 »
Nejlepším databázovým API je SQL.
Ovšem když chcete někoho pustit ke své službě, neznamená to, že nejlepší je zpřístupnit mu databázi.