Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Filip Jirsák

Stran: 1 ... 144 145 [146] 147 148 ... 375
2176
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 24. 10. 2019, 22:04:03 »
Jenže on to je principiální problém, se kterým si B-stromy ani heše neporadí. To by musel být ke každému klíči přidělen seznam ID záznamů, které tomu klíči vyhovují, abys mohl vždy vybrat jen ten první a jít dál.
Existují ale i jiné druhy indexů. Hash si s tím neporadí, protože v indexu není uložena hodnota. B-Tree si s tím může poradit například právě tím způsobem, jaký jste popsal – v každém listu bude uložen seznam záznamů, které ten klíč obsahují. Vybírat první záznam není potřeba, protože hodnotu zná databáze už z indexu. Problém s B-Tree je jenom tehdy, pokud se používá upravená varianta, která umožňuje ukládat duplicitní klíče přímo jako samostatné uzly stromu – jako to má právě PostgreSQL nebo Oracle. To ale není obecná vlastnost B-Tree, naopak je to spíš odchylka těchto databází od standardní implementace B-Tree (i když je to odchylka logická, protože umožňuje řešit neunikátní hodnoty pořád v rámci jedné datové struktury B-Tree).

2177
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 24. 10. 2019, 21:12:11 »
Našeptávání je úplně jiná úloha.
Našeptávání je jediná reálná úloha, kdy uživatel pracuje se seznamem štítků. Jak už jsem psal, pokud píšete databázovou aplikaci, kde uživatel často potřebuje získat seznam stovek nebo více záznamů, aby v nich pak sám něco ručně hledal, je na vaší aplikaci něco hodně špatně. Takže úloha „dej mi seznam všech štítků“ je sice hezké teoretické cvičení, ale pro praxi je to k ničemu.

Filipe, na DISTINCT opravdu indexy nezabírají.
Když píšete o implementaci nějakého konkrétního databázového enginu, konkrétně ho pojmenujte. Když to napíšete takhle obecně, někdo by si mohl myslet, že je to nějaký principiální problém.

spellchecker/stemmer
Až na to, že spellchecker je něco úplně jiného, než stemmer. Spellchecker je prostý dotaz „existuje toto slovo?“, případně vylepšený o „pokud neexistuje, jaká podobná slova existují?“. Stemmer je nalezení kořene slova.

Rozhodně rychlejší, než index štítků v dlouhé tabulce.
Jenom jestli to ví třeba Google, že vyhledávání slova ve fulltextovém indexu závisí na celkovém počtu dokumentů a ne na počtu různých slov v indexu.

2178
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 23. 10. 2019, 23:03:42 »
Budem se tu ještě dlouho plácat kolem štítků, když víme, že je to M:N? Máme na to jasný a osvědčený vzor s bázovou tabulkou, jedním číselníkem a jednou vazební tabulkou.
Snad byste nechtěl porovnávat databázový výkon pro běžné operace – tj. získání seznamu štítků daného objektu, získání objektů s daným štítkem a přidání a smazání štítku u daného objektu. To ne, tady se přece porovnává výkon tak zásadních operací, jako je výpis všech štítků.

2179
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 23. 10. 2019, 22:54:33 »
Já narozdíl od Tebe netvrdím, že existuje nějaký index, který by Ti v tomto případě pomohl.
Aha. Takže uchovávat množinu krátkých textů je podle vás pro počítače neřešitelný úkol. Viděl jste někdy spellchecker, úplně tu nejprimitivnější implementaci? To je prostě množina slov, ve které se dá rychle vyhledat, jestli v ní dané slovo je nebo není. Seznam těch slov je možné i vypsat. Té struktuře, která umožňuje rychlé vyhledávání, se říká – index.

To, co potřebujete pro práci se štítky, je našeptávač. Přičemž našeptávače se běžně používají, fungují, a jsou implementované právě pomocí fulltextových indexů. Vypsat všechny hodnoty našeptávač (resp. použitý index) samozřejmě také umí, akorát se taková funkce v našeptávači neposkytuje uživatelům, protože je k ničemu.

To je právě ten rozdíl v našem přístupu. Já považuju za samozřejmost pro práci se štítky fulltextové a podobnostní vyhledávání (našeptávač). Pro vás je to zbytečnost, pak se ale divíte, že máte v databázi velmi podobné štítky. Jediné, co dokážete uživateli nabídnout, je vypsat mu všechny štítky, ať s nimi může pracovat v nějakém normálním programu a místo vaší aplikace.

Ale aspoň z toho máme další hezkou poučku pro začátečníky: pokud vaši uživatelé chtějí vypisovat stovky záznamů (ať už najednou, nebo stránkovaně), znamená to, že jim poskytujete špatné funkce pro filtrování a vyhledávání. Nikdo nechce hledat něco očima ve stovkách záznamů (nebo si to exportovat do Excelu a tam s tím čarovat).

2180
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 23. 10. 2019, 21:54:54 »
A to je ten problém, který Ti nedochází a kvůli kterému je Tebou navržená struktura zoufale neefektivní. Nelze totiž levně přejít na další záznam, který se liší nevirtuálním sloupcem.
Přečtěte si předchozí komentář, tam je to vysvětlené. Problém není ve struktuře dat, ale v použitém typu indexu. Přičemž pro štítky je B-Tree index nevhodný tak jako tak, pro štítky je potřeba používat fulltextový index.

2181
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 23. 10. 2019, 21:22:29 »
Listy toho stromu jsou zaindexované hodnoty. Teprve od té hodnoty vede odkaz na seznam záznamů, kde se ta hodnota vyskytuje.
Díval jsem se ještě na B-Tree indexy Oraclu a PostgreSQL, a tam tohle neplatí. PostgreSQL má u neunikátního B-Tree indexu zapsané v indexu hodnoty opakovaně, protože každý list obsahuje odkaz na jeden řádek. Oracle má u neunikátního B-Tree indexu ROWID jako součást klíče, což je prakticky to samé. Teoreticky by nad těmi indexy mohly mít implementovanou funkci „najdi další klíč“, ale asi by nebyla moc využívaná. Pokud byste tedy opravdu použil pro štítky B-Tree index, máte pravdu.

Nicméně pro rozumnou implementaci štítků je potřeba použít fulltextový index. Tam už je to s jejich strukturou rozmanitější, nicméně s tím, že pod jedním klíčem bude větší množství záznamů, obvykle počítají.

2182
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 23. 10. 2019, 20:46:51 »
Koukám, že jsi furt nepochopil, kde je v Tvé DB struktuře problém. Příklad byl ZÁMĚRNĚ bez řazení, aby Ti demonstroval, že INDEX NEUMÍ AKCELEROVAT OPERACI DISTINCT. V Tvém dotazu se index použije pouze na řazení, ale práci oproti full table scanu (nebo přesněji sekvenčnímu scanu, protože po nalezení dostatečného počtu hodnot se zastaví) Ti neušetří ani náhodou.
Příště se zase ohánějte tím, že mé příklady neodpovídají realitě. V mé DB struktuře je problém, že je připravená na reálné použití a není optimalizovaná na nesmyslné dotazy typu „potřebuji všechny štítky z databáze v náhodném pořadí“. Prozradím vám, kdy je ten váš dotaz obvykle potřeba – pokud je vaše aplikace tak neschopná, že si z ní uživatel raději data vyexportuje a pracuje s nimi dál v Excelu.

Problém je v tom, že v indexu jsou odkazy na VŠECHNY záznamy. NENÍ to seznam unikátních hodnot.
B-Tree vskutku není seznam, B-Tree je strom. Listy toho stromu jsou zaindexované hodnoty. Teprve od té hodnoty vede odkaz na seznam záznamů, kde se ta hodnota vyskytuje. Jenže v mnou uvedeném příkladu databáze ty záznamy vůbec nepotřebuje, protože hodnoty zná už z indexu.

bude pro DB znamenat projít prvních sto tisíc záznamů indexu
Mohl byste nám nastínit, jak podle vás vypadá takový databázový index? A jak ho databáze používá pro hledání, když podle vás prochází jakési „záznamy indexu“ jeden po druhém?

2183
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 23. 10. 2019, 17:53:00 »
Evidentně narozdíl od Tebe nejen slyšel, ale umím je i používat a vím, kdy se použijí a kdy ne :-)
Umíte je používat? Vážně?

Kód: [Vybrat]
CREATE TABLE stitky (stitek VARCHAR NOT NULL);
CREATE INDEX idx_stitky ON stitky USING BTREE (stitek);
INSERT INTO stitky (stitek) VALUES ('Praha1'), ('Praha1'), ('Brno1'), ('Ostrava1'), ('Brno1'), ('Praha1'), ('Praha1'), ('Ostrava1'), ('Zlín1');

INSERT INTO stitky (stitek) VALUES ('Praha10'), ('Praha10'), ('Brno10'), ('Ostrava10'), ('Brno10'), ('Praha10'), ('Praha10'), ('Ostrava10'), ('Zlín10');
VACUUM;
EXPLAIN SELECT DISTINCT stitek FROM stitky ORDER BY stitek LIMIT 10;
QUERY PLAN                             
-------------------------------------------------------------------------------------------
 Limit  (cost=0.14..2.35 rows=10 width=7)
   ->  Unique  (cost=0.14..9.88 rows=44 width=7)
         ->  Index Only Scan using idx_stitky on stitky  (cost=0.14..9.63 rows=99 width=7)

Samozřejmě, pokud na uživatele vylejete stovky štítků, ať si v tom hledá sám, protože to aplikace neumí, bude to pro databázi jiný úkol. Nicméně i tam se jí index bude hodit alespoň pro řazení. Teda pokud ty štítky aspoň seřadíte.

2184
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 23. 10. 2019, 10:35:29 »
Zase jen dokola opakujete vyvrácené. Pokud chcete nějakou reakci, přečtěte si mé předchozí komentáře, nedává smysl, abych je znovu opakoval.

Jediné nové, co jste napsal, je zase nesmysl:
při přejmenování štítku to bude zbytečně zamykat všechny záznamy se štítkem, místo toho, co by si to prostě vedle změnilo štítek
Přejmenování štítku je výjimečná operace. Vy ale budete muset složitě řešit přidávání štítku i mazání štítku, což jsou mnohem častější operace.

SELECT DISTINCT v takovém případě bude full table scan
O existenci indexů jste už slyšel?

2185
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 23. 10. 2019, 10:28:45 »
Filipovi bylo potvrzeno to, že jeho řešení je funkční, jen bylo poznamenáno, že to lze řešit prozíravěji. Celý ten diskusní šprajc nechápu, připadá mi to jako "proč to dělat dobře a stejně jednoduše, když to jde i blbě a stejně jednoduše".
Přesně tak. Vy navrhujete „proč to dělat dobře a jednoduše, když to jde i blbě a složitě“. Celý ten diskusní šprajc je jenom o tom, že když vy to chcete dělat blbě a složitě, klidně to tak dělejte, ale neraďte to začátečníkům jako best practice.

2186
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 23. 10. 2019, 10:27:07 »
Je to krátkozraké. Co když bude potřebný víc než jeden štítek? A co indexování štítků pro lepší vyhledávání? Bude to stíhat, když budu pravidelně potřebovat seznam štítků?

Pro evidenci domácích CD bych však jeden sloupeček pro štítky klidně použil.
To myslíte vážně? Pokud bude povoleno víc štítků, potřebuju vazební tabulku – nijak to nesouvisí s tím, zda mám nebo nemám číselník štítků. Indexování štítků se udělá tak, že se na příslušném sloupečku dá normálně index.

2187
Sítě / Re:Zabezpečení databáze
« kdy: 23. 10. 2019, 07:24:45 »
Útočit se dá jak na VPN server tak na SSH server. Když už tam SSH server je, je nejjednodušší udělat ten tunel. Někteří SQL klienti (třeba DataGrid) s tím umí rovnou pracovat – v rámci konfigurace spojení zadáte i údaje pro SSH tunel a nepotřebujete nic dalšího.

2188
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 23. 10. 2019, 07:21:14 »
Tento přístup se v relačních databázích nepoužívá, to dělají jen bastly přes ORM.
Možná proto je teď takový boom NoSQL databází. Protože když si někdo nechá poradit s něčím, co by řešil jeden sloupeček, od „databázového SQL specialisty“, navrhne dotyčný několik tabulek a k údržbě bude potřeba uložené procedury a triggery.

Ostatně svědčí o tom i to, že já jsem popsal už dva příklady, ale Miroslav Šilhavý nebo Logik ještě ani jeden – asi ještě přidávají další tabulky. Tak doufám, že se někdy dočkám příkladu, kde by se podle nich použil INNER JOIN – tak, že nejprve obecně popíšou pravidlo, kdy se podle nich má používat INNER JOIN, a pak to ukáží na konkrétním příkladu.

2189
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 22. 10. 2019, 21:58:43 »
Zde je možná ještě na místě dodat, že štítky se často používají nad více tabulkami. Pak by bylo nutné tvořit DISTINCT UNION DISTINC [UNION DISTINCT ...], což myslím jen podtrhuje absurditu takového návrhu.
A jindy zase chci jednu sadu štítků pro jednu entitu a jinou sadu štítků pro jinou entitu. Ale pokud jste chtěl ukázat, že neexistuje jeden univerzální návrh databáze, který by se hodil na všechno, pak se vám to podařilo. Gratuluju, úžasný objev.

2190
Vývoj / Re:MySQL - podmíněný SELECT přes dvě tabulky
« kdy: 22. 10. 2019, 21:57:07 »
S tou nevhodnou situací jsi ovšem přišel Ty sám, že "je třeba informovat vedoucí pracovníky". A na tuto TEBOU stanovenou situaci je TEBOU navržené řešení nevhodné, protože mi neumožní informovat člověka, o kterém vím, že zítra ty podřízené pracovníky mít bude.
Jenže já jsem nepopisoval takhle obecnou situaci.

Nu, a ostatní Ti ten Tvůj "možný" model (který je spíše nemožný :-), ale dejme tomu) opravili na dobrý.
Model, který odporuje zadání, lze těžko nazývat dobrým.

Miroslav tvrdil, že to nejde zkontrolovat bez existence explicitního příznaku.
Nikoli. Mimochodem, bez explicitního příznaku není co kontrolovat. Což je právě ta výhoda mého řešení, že nemusíte pracně udržovat kopii informace, protože vždy pracujete s primárním zdrojem.

Jenže to je vlastně důsledek absurdní definice vedoucího: jde totiž o klasickou definici kruhem: že ten kdo má podřízené má podřízené.
Takhle já jsem to ovšem nedefinoval. Když si takhle předefinujete vaši definici, totiž že podřízené má ten, kdo může a nemusí mít podřízené, absurdního a tom není nic, že…

Ty jsi se touto tautologickou definicí se snažil dát dotazu: "ti kdo mají podřízené" nějaký větší smysl oproti dotazu "ti, kdo nemají podřízené".
A další vaše dojmologie, která nemá nic společného s tím, co jsem ve skutečnosti psal.

Uffff. Na to se dá říct jen to, že evidentně nemáš zkušenosti s tím, čeho jsou uživatelé schopni, a že bych fakt nechtěl pracovat s DB navrženou podle Tebou ražených principů
Takže vy byste uživatelům neumožnil vytvářet nové štítky? Vytvářel by je nějaký administrátor, nebo by dokonce dostali od vás předem určenou sadu štítků? Obávám se, že jste nepochopil princip štítků…

Ano, např. když mu aplikace neposkytne přehled použitých šťítků a možnost je např. přejmenovávat a slučovat
Proč by mu takový přehled neposkytla? V mém řešení je to jednoduché.

Samozřejmě přehled štítků je možné udělat i z Tvojí struktury pomocí select distinct, ale to už je zas klasickej rovnák na vohejbák
Nikoli, je to přesně to, jak se se štítky pracuje. Je to prostě nějaký text, který se přilepí k dané entitě. Nenese žádnou další informaci, vzniká prostě tím, že se k dané entitě připojí, maže se tak, že se od entity smaže. Neexistuje žádný seznam povolených štítků, nezakládají se nové štítky ani se nemažou. Pokud chci seznam všech štítků, sesypu všechny použité štítky na jednu hromadu.

Je to buďto porušení 3NF, anebo porušení jiného naprosto základního dabázového principu: "Nevýznamových identifikátorů míti budeš". Tebou ražený princip je stejná pitomost, jako např. mít v DB jako klíč rodné číslo. A tento přístup se Ti brzo vymstí, jakmile např. bude chtít zákazník štítky prioritizovat, nebo např. třeba lokalizovat do více jazyků. Todle je fakt s odpuštěním čuňárna.
Jasně, zákazník chtěl jednoduché štítky, tak, jak je má každá aplikace. Ale vy mu z toho uděláte raketoplán, protože co kdyby to náhodou někdy potřeboval. Uživatel si původně chtěl jenom něco označit svými názvy, a teď musí určit prioritu štítku, přeložit ho do dalších jazyků a přes vedoucího požádat administrátora systému o založení štítku.

Když už to prezentujete jako rady začátečníkům, dodejte také kontext. Že jsou to rady pro vývoj na projektu, který se bude vyvíjet několik let a v nejlepším případě se nikdy nenasadí, bude na něm dělat spousta programátorů, takže alespoň někteří budou programovat aspoň přibližně to, co chtěl zákazník – a pak si možná někdo může vymýšlet svou vlastní práci a programovat složitě něco, co vůbec nikdo nechtěl a nikdy to nikdo nebude používat.

Máš evidentně problém pochopit, co druhý tvrdí.
Napsal jste komentář, kde jsou všechny vaše interpretace jiných komentářů (nejen mých) chybné. Problém je evidentně na vaší straně. Nějak nevidím smysl v tom, abych dál opravoval vaše dezinterpretace – ty původní komentáře si přece můžete přečíst sám.

Stran: 1 ... 144 145 [146] 147 148 ... 375