Společnost JetBrains představila (YouTube) svou umělou inteligenci JetBrains AI a nástroj AI Assistant v IDE.
Byla vydána nová verze 255 správce systému a služeb systemd (GitHub, NEWS). Z novinek lze vypíchnout například novou službu systemd-bsod.service.
Google představil Gemini, svůj největší a nejschopnější model umělé inteligence.
openSUSE komunita vybírá nová loga. Jedním z cílů je odlišit se od SUSE. Aktuálně probíhá hlasování o logu openSUSE a čtyř distribucí Tumbleweed, Leap, Slowroll a Kalpa.
Raspberry Pi OS, oficiální operační systém pro Raspberry Pi, byl vydán v nové verzi 2023-12-05. Přehled novinek v příspěvku na blogu a poznámkách k vydání. Nově jej lze používat také s tmavým tématem.
Dnes je to 10 let, co byla vytvořena decentralizovaná kryptoměna Dogecoin. Autoři Billy Markus a Jackson Palmer ji původně zamýšleli jako vtip. Znakem kryptoměny je pes Shiba-Inu známý z internetových memů.
Google Chrome 120 byl prohlášen za stabilní. Nejnovější stabilní verze 120.0.6099.62 přináší řadu oprav a vylepšení (YouTube). Opraveno bylo 10 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře (YouTube).
Byla vydána nová verze 2023.4 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem nových nástrojů v oficiálním oznámení. Vypíchnout lze podporu Cloud ARM64, Vagrant Hyper-V a Raspberry Pi 5.
Společnosti IBM, Meta a dalších vice než 50 zakládajících členů (bez Microsoftu a OpenAI) vytvořili mezinárodní alianci AI Alliance pro spolupráci na vývoji a rozvoji otevřené, bezpečné a odpovědné umělé inteligence.
Služba pro hlídání uniklých hesel Have I Been Pwned oslavila 10. výročí. Troy Hunt ji spustil 4. prosince 2013 (Twitter).
TAB1 id | nazev | obec | ico | dic | act ---+-------------+------+--------+----------+------ 15 | AAA s.r.o. | Brno |12345678|CZ12345678| 0 TAB2 uziv | id | akce | datum -----+----+---------+--------- 2 | 15 | smazano | 2011-7-9 TAB3 id |jmeno |prijmeni ----+------+---------- 2 |Jan | Novák požadovaný výsledek by měl vypadat takto nazev |obec |ico |dic |datum | jmeno |prijmeni ------------+-------+---------+-----------+---------+--------+-------- AAA s.r.o. | Brno |12345678 |CZ12345678 |2011-7-9 | Jan | NovákTy tabulky nejsou kompletní jsou větší, ale pro demonstraci to stačí. TAB2 je v podstatě log z TAB1 kam ukládám všechny změny provedené v TAB1. Act znamená jestli je záznam aktivní nebo je smazán(jelikož má vazbu i na jinou tabulku tak není smazán, ale označen jako neaktivní). Výsledná tabulka je seznam všech smazaných záznamů z TAB1 rozšířená o informace kdy byl záznam označen jako smazaný a kdo to udělal. Problém je, že si s tím nevím rady. Udělat to na straně PHP není problém, ale chci to udělat na straně serveru PostgreSQL. Máte někdo nějakou radu?
Řešení dotazu:
SELECT tab1.nazev, tab1.obec, tab1.ico, tab1.dic, tab2.datum, tab3.jmeno, tab3.prijmeni FROM tab1 JOIN tab2 ON (tab1.id = tab2id) JOIN tab3 ON (tab2.uziv = tab3.id) WHERE tab1.act = 0 AND tab2.akce = 'smazano'Případně starým zápisem JOINu (mně připadá přehlednější):
SELECT tab1.nazev, tab1.obec, tab1.ico, tab1.dic, tab2.datum, tab3.jmeno, tab3.prijmeni FROM tab1, tab2, tab3 WHERE tab1.id = tab2id) AND tab2.uziv = tab3.id) AND tab1.act = 0 AND tab2.akce = 'smazano'Také by to chtělo udělat normalizaci, ta akce asi nebude jen tak libovolný text – spíš budete mít omezený počet akcí, takže byste si na to měl udělat číselník a jenom se do něj odkazovat.
uziv | id | akce | datum -----+----+---------+--------- 2 | 15 | smazano | 2011-7-1 -----+----+---------+--------- 3 | 16 | smazano | 2011-7-8 -----+----+---------+--------- 4 | 17 | smazano | 2011-7-9kterou normální formu tahle relace porušuje? opakovaný výskyt hodnoty "smazano" není o nic víc duplicitní oproti jeho nahrazení nějakým intem a snižuje to čitelnost:
uziv | id | akce | datum -----+----+------+--------- 2 | 15 | 3 | 2011-7-1 -----+----+------+--------- 3 | 16 | 3 | 2011-7-8 -----+----+------+--------- 4 | 17 | 3 | 2011-7-9tohle je porušení 3NF:
uziv_jmeno| uziv_prijmeni | id | akce | datum ----------+---------------+----+------+--------- Filip | Jirsák | 15 | fubar| 2011-7-1 ----------+---------------+----+------+--------- Filip | Jirsák | 16 | fubar| 2011-7-8 ----------+---------------+----+------+--------- Chris | Date | 17 | snafu| 2011-7-9 ----------+---------------+----+------+---------
a nedozvěděl sem se kde že sou ty duplicityTo mě taky zajímá. Páně Jirsák se stále arogantně ohání tím, že on jediný ví a chápe, co je relační databáze, ale vysvětlení duplicit zatím nikde.
pokud bych to potřeboval, tak mi nic nebrání ENUM zmigrovat do tabule, věci co nepotřebuju neprogramuju (YAGNI)Proč místo enumu nepoužít tabulku rovnou, když předpokládám, že mi enum stačit nebude? Není to o nic náročnější, než vytvořit enum (ve skutečnosti je to spíš jednodušší).
stejně tak když se ve sloupci opakujou hodnoty z dané množiny, tak to taky není duplicitaKdyž se opakují odkazy, duplicita to není, když se opakují hodnoty z dané množiny, duplicita to je.
blbost, u počítače to může tak akorát žrát víc paměti, lidem se pracuje líp se stringama; muj čas je dražší než procesorovej časU počítače to také může prodlužovat dobu přístupu – hůř se to indexuje, musíte z disku načíst víc dat… Lidem se líp pracuje s texty, pokud mají nějaký význam. Ale identifikátor řádku? Můžete zvolit nějaký syntetický text, ale
ahWgay9z
bude pro člověka mnohem horší, než 93
. Nebo zvolíte nějaký významový identifikátor, který bude užitečný do té doby, než se význam daného řádku odliší od významu identifikátoru. Pak budete mít řádek s významem „varování“ pojmenovaný identifikátorem „chyba“, a lidi to bude akorát mást, protože budou mít tendenci tomu bezvýznamovému identifikátoru přikládat význam.
není, hodnota je vždycky hodnota ať už za ní stojí cizí klíč nebo ne;Nesmíte se nechat zmást tím, že vazby mezi tabulkami jsou v relačních databázích z historických důvodů řešeny hodnotami a cizími klíči.
nesyntetický id sou pro člověka lepší pokud je možný je použítPřičemž podle mne množina „kdy je možný je použít“ je prázdná.
Nesmíte se nechat zmást tím, že vazby mezi tabulkami jsou v relačních databázích z historických důvodů řešeny hodnotami a cizími klíči.Fíha, až takový úlet jsem nečekal… a relační logika jako nic, že?
Když se opakují odkazy, duplicita to není, když se opakují hodnoty z dané množiny, duplicita to je.To znamená, že když uložím do tabulky opakovaná URL, tak to duplicita není? Jsou to také odkazy. Odkazy na cizí klíče jsou také hodnotami z dané množiny. Pokud se opakují, _je_ to duplicita. Zní to jako by v tabulce byly povoleny pouze primární a cizí klíče. Navíc všechny číselné.
Můžete zvolit nějaký syntetický text, aleMy se ale nebavíme o syntetickém textu, to by byl skutečně lepší syntetický integer. Bavíme se o čitelném textu, který má vyjadřovací hodnotu. Pokud takový text nemá a nebude mít další atributy, je zbytečné ho cpát do další tabulky a generovat k němu další syntetické klíče.ahWgay9z
bude pro člověka mnohem horší, než93
.
My se ale nebavíme o syntetickém textu, to by byl skutečně lepší syntetický integer. Bavíme se o čitelném textu, který má vyjadřovací hodnotu. Pokud takový text nemá a nebude mít další atributy, je zbytečné ho cpát do další tabulky a generovat k němu další syntetické klíče.Ono to nelze obecně tvrdit dokonce ani o tom syntetickém textu.
U počítače to také může prodlužovat dobu přístupu – hůř se to indexuje, musíte z disku načíst víc dat…Udělal jsem si takový maličký benchmark, který sice není příliš relevantní, ale nějaké hodnoty jsem z něj dostal. Udělal jsem si tabulku se třemi sloupci typu ENUM, CHAR(15) a FOREIGN KEY. Do ní 2.6 M záznamů. Potom jsem dělal
select count(*) group by klíč;
Zapsal jsem ze 3 měření vždy to nejlepší. Výsledky:
ENUM 3391 ms CHAR(15) 4712 ms FOREIGN KEY 8285 msJe patrné, že cizí klíč je nejpomalejší - to jsme všichni čekali. Vítězem se stal ENUM, ale ne o moc, v závěsu mu byl CHAR. Co však bylo horší, s aktivním cizím klíčem se zpomalil insert. Pochopitelně. Neměřil jsem o kolik. Rozdíly jsou však tak malé, že je prakticky zbytečné rozhodovat se, které řešení použít, jen na základě výkonu. Chtěl jsem tím jen vyvrátit tvrzení, že použití číselníku je výhodnější pro výpočet. Nemusí to platit vždy a za všech okolností.
SELECT COUNT(*) … GROUP BY
samozřejmě není procházení všech položek a index se při něm uplatní velice dobře. Záleží na typu indexu, ale většinou už tam ten počet bude uložen; a i kdyby nebyl, stačí spočítat ty položky v indexu a není nutné prolézat celou tabulku.
select subselect.pocet, ciselnik.text from (select count(*) as pocet, cislo from tabulka group by cislo) subselect
inner join ciselnik on (subselect.cislo = ciselnik.cislo)
A je to opět rychlejší než implementace pomocí varchar.
Mě to vychází na mejch datech, kdy mám ve varchar políčku jen jeden znak 290ms ku 320ms, když bude varchar delší,
tak se to ještě více rozrůzní. Jelikož enum je ve vnitřní reprezentaci int, a todle vychází stejně rychle s joinem
jako bez joinu, tak bys na svejch datech měl dostat podobnej výkon, jako u enumu (kterej je interně int).
PS: Nevím, proč tady používat typ character, jakej má smysl, že se to doplní mezerama...
Tak je konečná, nebo se do ní mohou přidávat položky?Ano.
id | action | .... ------------+ 2 | 1 | ------------+ 3 | 2 | ------------+ 4 | 4 |číselník
id | name | ------------+ 1 | delete | ------------+ 2 | insert | ------------+ 4 | update |přičemž když už bych byl nucenej použít extra tabuli (protože ještě nějaký data, případně potřebuju mít ještě slave tabuli závislou na tom číselníku), tak bych to udělal takhle: data:
id | action | .... ------------+ 2 | delete | ------------+ 3 | insert | ------------+ 4 | update |číselník
id |.... --------+ delete | --------+ insert | --------+ update |což splňuje moje nároky na čitelnost princip relačních databází sem IMHO pochopil docela dobře
Ještě k tomu snížení čitelnosti – použití relační databáze vždy snižuje čitelnost, ... Pokud chcete, aby jedna tabulka v relační databázi byla sama sobě čitelná, nepochopil jste princip relačních databází.Principem normalizace je tedy, že z čitelných databázových tabulek děláme nečitelné? To snad ne. Spojování tabulek relační databázi nedělá.
Tímhle způsobem je možné za normalizovanou prohlásit jakoukoli databázovou strukturu.Protože to pan Jirsák zakázal :D. Bohové.
akce
. Pokud to interpretujeme tak, že existuje několik různých typů akcí, každý ten typ akce má svůj název a do onoho sloupečku ukládáme právě ten název, pak taková tabulka samozřejmě nesplňuje 2NF, protože název typu akce nezávisí vůbec na ničem z dané tabulky. Atribut akce
taky můžeme interpretovat jako volný textový popisek (de facto poznámka) určený jen pro zobrazení uživateli. Pak to normální formu neporušuje, a takovému atributu nastavím nejspíš nějaký typ dlouhého textu a možnost vkládat NULL. Další možná interpretace je, že ten atribut obsahuje nějaký identifikátor typu akce, přičemž ale samotné typy akcí už mne v databázi nezajímají. Pak to také odpovídá minimálně 3NF, ale zase budu pro atribut identifikátor volit nějaký odpovídající databázový typ – nejlépe enum nebo alespoň omezení s výčtem povolených identifikátorů. Z toho je taky vidět, že datové typy se sice neřeší přímo při normalizaci, ale řeší se při ní význam atributů, který pak logicky ovlivňuje datové typy.
Doufám, že teď už to pochopili i ti, kteří si mysleli, že normální formy se dají stanovit bez znalosti významu atributů.
To prave vsichni nepochybne chapou. … Tyto vlastnosti atributu pochopitelne vychazeji ze skutecnosti, ktera se modeluje, to je tak zjevne, ze se snad o tom neni treba zminovat!V této diskusi to většina lidí nechápala, takže bylo potřeba to zmínit.
Problem je v tom, ze ty zrejme za pomoci kristalove koule interpretujes trivialni text "insert" jako nazev jakesi komplexni entity "akce" a navic predpokladas, ze nazev neni jeji PK.Někdo jiný zase pomocí křišťálové koule interpretuje ten text jako poznámku pouze pro zobrazení a někdo jiný také pomocí křišťálové jako identifikátor akce, která je definována mimo databázi. Můžeme se bavit o tom, co je pravděpodobnější. Nicméně tazatel neuměl napsat ani jednoduché spojení tabulek, takže upozornit ho na to, že by se měl zamyslet i nad tímto atributem, rozhodně není na škodu.
neni zadny duvod, proc by nazev akce nemohl byt primarnim klicemDůvodem je menší efektivita indexu nad řetězcem. Ale to není to, o co původně šlo – původně šlo o to, že (podle mne) v té databázi název akce není primárním klíčem, není to ani enum a ani tam není žádné omezení, protože si tazatel moc nepromýšlel, co ta jeho struktura databáze vlastně vyjadřuje. Tedy nemohl udělat ani normalizaci.
Ty tady vnucujes, ze PK musi byt ve "spravnem" modelu cisloNevnucuju. Jenom tvrdím, že když použiju umělý primární klíč, je z důvodu efektivity lepší použít číslo.
Také by to chtělo udělat normalizaci, ta akce asi nebude jen tak libovolný text – spíš budete mít omezený počet akcí, takže byste si na to měl udělat číselník a jenom se do něj odkazovat.kuka naproti tomu napsal, že výroba tý tabule není normalizace, takže doufam že konečně stáhnete ocas a nebudete se tu vydávat za experta
Protože když chcete podle něčeho filtrovat, musíte mít někde seznam přípustných hodnot.Třeba v ENUM nebo CONSTRAINT.
SELECT * FROM
dostane programátor data, a pak si je konečně může v aplikaci spojit, vytřídit a seřadit.
id | nazev ---+----------- 15 | AAA s.r.o.s jediným constraintem - primární klíč nad atributem id můžu filtrovat záznamy podle atributu nazev? ano. pokud tam mam milióny záznamů, pořídim nad atributem name index ty kecy o blobu si strčte za klobouk
ty kecy o blobu si strčte za kloboukTo je asi to jediné, co k tomu můžete říci. Jinak by se ukázalo, že takový BLOB splňuje všechny vaše požadavky na normalizovanou databázi. V normálně strukturované databázi se samozřejmě nebudou používat volné texty pro číselníkové hodnoty, podle kterých se navíc má filtrovat. V normálně strukturované databázi se také nebude filtrovat podle názvu, bude se podle něj nanejvýš hledat. A taky se v normálně strukturované databázi nebude vše řešit „vytvořením indexu“, ale nejprve se podle ukládaných dat logicky navrhne struktura tabulek a vazeb. Ale toho si nevšímejte, to jsou mnohem přísnější požadavky, než které vy nazýváte normalizovanou databází.
V normálně strukturované databázi se také nebude filtrovat podle názvu, bude se podle něj nanejvýš hledat.Nějak mi uniká rozdíl mezi hledáním a filtrováním.
Odstranění těch volně psaných textových hodnot je normalizace.Citation needed.
Toho, že může porušovat nějaká doporučení, si obvykle nejvíc užívá ten, kdo nechápe, k čemu jsou dobrá. Expert, který porušuje nějaké dobré doporučení, velice dobře ví, proč to dělá.Každý databázový specialista ví, že po úspěšné normalizaci musí provést i denormalizaci. Jinak ta aplikace bude líná až nepoužitelná. Pokud potřebuji do databáze sypat logy, tak normalizaci dělat nebudu, to dá rozum. Dokonce nebudu dělat ani silná integritní omezení.
Tiskni
Sdílej: