abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 18:00 | Nová verze

    Byla vydána (Mastodon, 𝕏) nová stabilní verze 2.0 otevřeného operačního systému pro chytré hodinky AsteroidOS (Wikipedie). Přehled novinek v oznámení o vydání a na YouTube.

    Ladislav Hagara | Komentářů: 1
    dnes 16:00 | Zajímavý software

    WoWee je open-source klient pro MMORPG hru World of Warcraft, kompatibilní se základní verzí a rozšířeními The Burning Crusade a Wrath of the Lich King. Klient je napsaný v C++ a využívá vlastní OpenGL renderer, pro provoz vyžaduje modely, grafiku, hudbu, zvuky a další assety z originální kopie hry od Blizzardu. Zdrojový kód je na GitHubu, dostupný pod licencí MIT.

    NUKE GAZA! 🎆 | Komentářů: 3
    dnes 13:33 | IT novinky

    Byl představen ICT Supply Chain Security Toolbox, společný nezávazný rámec EU pro posuzování a snižování kybernetických bezpečnostních rizik v ICT dodavatelských řetězcích. Toolbox identifikuje možné rizikové scénáře ovlivňující ICT dodavatelské řetězce a na jejich podkladě nabízí koordinovaná doporučení k hodnocení a mitigaci rizik. Doporučení se dotýkají mj. podpory multi-vendor strategií a snižování závislostí na vysoce

    … více »
    Ladislav Hagara | Komentářů: 4
    dnes 12:22 | Humor

    Nizozemský ministr obrany Gijs Tuinman prohlásil, že je možné stíhací letouny F-35 'jailbreaknout stejně jako iPhony', tedy upravit jejich software bez souhlasu USA nebo spolupráce s výrobcem Lockheed Martin. Tento výrok zazněl v rozhovoru na BNR Nieuwsradio, kde Tuinman naznačil, že evropské země by mohly potřebovat větší nezávislost na americké technologii. Jak by bylo jailbreak možné technicky provést pan ministr nijak nespecifikoval, nicméně je známé, že izraelské letectvo ve svých modifikovaných stíhačkách F-35 používá vlastní software.

    NUKE GAZA! 🎆 | Komentářů: 15
    dnes 06:00 | Zajímavý článek

    Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 162 (pdf).

    Ladislav Hagara | Komentářů: 0
    dnes 05:55 | IT novinky

    Sdružení CZ.NIC, správce české národní domény, zveřejnilo Domain Report za rok 2025 s klíčovými daty o vývoji domény .CZ. Na konci roku 2025 bylo v registru české národní domény celkem 1 515 860 s koncovkou .CZ. Průměrně bylo měsíčně zaregistrováno 16 222 domén, přičemž nejvíce registrací proběhlo v lednu (18 722) a nejméně pak v červnu (14 559). Podíl domén zabezpečených pomocí technologie DNSSEC se po několika letech stagnace výrazně

    … více »
    Ladislav Hagara | Komentářů: 9
    včera 18:33 | IT novinky

    Google představil telefon Pixel 10a. S funkci Satelitní SOS, která vás spojí se záchrannými složkami i v místech bez signálu Wi-Fi nebo mobilní sítě. Cena telefonu je od 13 290 Kč.

    Ladislav Hagara | Komentářů: 7
    včera 16:22 | Komunita

    Byl publikován přehled dění a novinek z vývoje Asahi Linuxu, tj. Linuxu pro Apple Silicon. Fedora 43 Asahi Remix s KDE Plasma už funguje na M3. Zatím ale bez GPU akcelerace. Vývojáře lze podpořit na Open Collective a GitHub Sponsors.

    Ladislav Hagara | Komentářů: 0
    včera 14:00 | IT novinky

    Red Hat představil nový nástroj Digital Sovereignty Readiness Assessment (GitHub), který organizacím umožní vyhodnotit jejich aktuální schopnosti v oblasti digitální suverenity a nastavit strategii pro nezávislé a bezpečné řízení IT prostředí.

    Ladislav Hagara | Komentářů: 0
    včera 12:22 | Zajímavý software

    BarraCUDA je neoficiální open-source CUDA kompilátor, ale pro grafické karty AMD (CUDA je proprietární technologie společnosti NVIDIA). BarraCUDA dokáže přeložit zdrojové *.cu soubory (prakticky C/C++) přímo do strojového kódu mikroarchitektury GFX11 a vytvořit tak ELF *.hsaco binární soubory, spustitelné na grafické kartě AMD. Zdrojový kód (převážně C99) je k dispozici na GitHubu, pod licencí Apache-2.0.

    NUKE GAZA! 🎆 | Komentářů: 1
    Které desktopové prostředí na Linuxu používáte?
     (18%)
     (6%)
     (0%)
     (11%)
     (27%)
     (3%)
     (5%)
     (2%)
     (12%)
     (27%)
    Celkem 908 hlasů
     Komentářů: 25, poslední 3.2. 19:50
    Rozcestník

    Dotaz: 1:N relace, jak se pracuje?

    10.5.2011 10:16 petrrrr
    1:N relace, jak se pracuje?
    Přečteno: 1492×
    Dobrý den, navrhuji si pro svůj malý webík databázi a potřebuji 1:N relace. Vím, že se to zařizuje přes join, ale není mi jasný detail návrhu. Jakým způsobem je v jednom sloupci uchováno více údajů (N)? Napadá mě jedině, že jde o duplicitní záznam lišící se pouze v rozdílovém sloupci. Uvedu příklad:
    Interpreti:
    (pk) id_interpreta | jmeno | zanr (FK)
    Skladby:
    (pk)id_skladby | (fk)id_interpreta | (fk) id_interpret_spolu_s |nazev_skladby
    Zanry:
    (pk)id_zanru | nazev_zanru
    Potřebuji mít stav, že v interpreti.zanr bude víc záznamů. Napadlo mě, že se to řeší více 1řádkovými záznamy v tabulce Interpreti, příklad:
    1 | Karel Gott | pop
    1 | Karel Gott | jiný žánr
    Ale to potom nemohu u id_interpreta použít auto_increment.

    Řešení dotazu:


    Odpovědi

    10.5.2011 10:43 VM
    Rozbalit Rozbalit vše Re: 1:N relace, jak se pracuje?
    Tak tahkle určitě ne (přečtěte si něco o normalizaci DB):
    1 | Karel Gott | pop
    1 | Karel Gott | jiný žánr
    
    Asi potřebujete tohle, a není to relace 1:n, nýbrž m:n :
    tabulka interpreti
    interpret_id | interpret_jmeno
    1                 | Karel Gott
    
    tabulka zanry
    zanr_id | zanr_jmeno
    1          | pop
    2          | folk
    
    tabulka interpreti_zanry
    id | interpret_id | zanr_id
    1  | 1                 | 1
    2  | 1                 | 2
    (fk) interpreti(interpret_id)
    (fk) zanry(zanr_id)
    
    Tarmaq avatar 10.5.2011 12:46 Tarmaq | skóre: 39
    Rozbalit Rozbalit vše Re: 1:N relace, jak se pracuje?
    mozna bych to jeste zjednodusil, rekl bych ze umelohmotny identifikator pro zanry je zbytecny:
    interprets
    ----------
    id (PK) | name
    1       | Karel Gott
    2       | Atka Janouskova
    3       | Alicia Keys
    
    genres
    ------
    id (PK)| title
    pop    | Pop
    folk   | Folk
    rnb    | Rhythm&Blues
    
    interpret2genre
    ---------------
    interpret | genre
    1         | pop
    1         | folk
    2         | pop
    3         | rnb
    (pk) interpret, genre
    (fk) interprets(interpret)
    (fk) genres(genre)
    
    CREATE TABLE interprets (
      id NUMBER(16) PRIMARY KEY,
      name VARCHAR2(128)
    );
    CREATE TABLE genres (
      id VARCHAR2(16) PRIMARY KEY,
      title VARCHAR2(64) NOT NULL
    );
    CREATE TABLE interpret2genre (
      interpret NUMBER(16)
        CONSTRAINT fk_interpret2genre_interpret
        REFERENCES interprets
        ON DELETE CASCADE,
      genre VARCHAR2(16)
        CONSTRAINT fk_interpret2genre_genre
        REFERENCES genres
        ON DELETE CASCADE,
    
      CONSTRAINT pk_interpret2genre
      PRIMARY KEY (interpret, genre)
    );
    
    Don't panic!
    10.5.2011 14:24 petrrrr
    Rozbalit Rozbalit vše Re: 1:N relace, jak se pracuje?
    děkuji převelice! ještě večer vykoumám jak to uplácat v php (cykly). Mám totiž tedy: Chci takovýto výsledek: píseň|Karel Gott|žánr1, žánr2 Díky:
    SELECT `interpreti`.`interpret_jmeno` AS 'Interpret', `skladby`.`skladba_nazev` AS 'Název skladby', `zanry`.`zanr_jmeno` AS 'Žánr'
    	FROM `interpreti_zanry`, `interpreti`, `zanry`, `skladby`, `interpreti_skladby` WHERE
    	`interpreti_zanry`.`interpret_id`=`interpreti`.`interpret_id` AND
    	`interpreti_zanry`.`zanr_id`=`zanry`.`zanr_id` AND
    	`interpreti_skladby`.`skladba_id`=`skladby`.`skladba_id` AND
    	`interpreti_skladby`.`interpret_id`=`interpreti`.`interpret_id`;
    
    mám záznamy:
    Karlova_píseň_1 | Karel Gott | žánr1
    Karlova_píseň_1 | Karel Gott | žánr2
    Umím si zobrazit vše:
    $radku=mysql_num_rows($vysledek);
    if ($radku==0) echo "nic tu neni";
    else
    {
    	while ($zaznam=MySQL_Fetch_Array($vysledek)):
            	echo $zaznam["Interpret"]."
    \n"; echo $zaznam["Název skladby"]."
    \n"; echo $zaznam["Žánr"]."
    \n"; endwhile; }
    Ale přemýšlím, jak tam zakopomnovat ten druhý cyklus, který by vyzvednul ve třetím sloupci data a hodil je na jeden řádek... Prosím o naťuknutí, dodělám si to pak sám... Ještě jednou díky (je to fanouškovskej web, ne úkol do školy).
    10.5.2011 15:21 VM
    Rozbalit Rozbalit vše Re: 1:N relace, jak se pracuje?
    Nerozumim dotazu - priklad uz treti sloupec vypisuje.

    Jinak tip - dotaz lze prepsat na uspornejsi variantu:
    SELECT interpret_jmeno, skladba_nazev, zanr_jmeno
    FROM interpreti JOIN interpreti_zanry USING(interpret_id)
         JOIN zanry USING(zanr_id)
         JOIN interpreti_skladby USING(interpret_id)
         JOIN skladby USING(skladba_id);
    Predpokladam ze stejna skladba muze vyslovne patrit k vice interpretum - v opacnem pripade je tabulka interpreti_skladby zbytecna, misto ni by se dal interpret_id do tabulky skladby.
    10.5.2011 15:47 petrrrr
    Rozbalit Rozbalit vše Re: 1:N relace, jak se pracuje?
    ano, je přeci možné, aby jedna skladba měla více interpretů (zpívá: X feat Y). Dotaz jsem myslel takto: příklad PHP kódu jenž jsem dodal vypíše obsah spojených tabulek v toto tvaru:
    Karel Gott | Když muž se ženou snídá | pop
    Karel Gott | Když muž se ženou snídá | rock
    Karel Gott | Když muž se ženou snídá | blues
    já ale chci:
    Karel Gott | Když muž se ženou snídá | pop, rock, blues
    Potřebuji přistupovat do toho třetího sloupce a vypsat tam všechny žánry.

    Chápu, že by šlo, vyzjistit kolik dotaz vygeneroval řádků a tam udělat dlouhý for cyklus a spojovat obsahy z třetího sloupce. Ale já potřebuju vypsat 30 posledních přidaných skladeb. Napadá mě udělat si pomocnou funkci, která tyto žánry spojí pro jednu skladbu, ale není mi jasné jak rozlišovat jestli jsem u Káji nebo jinde. Opět lepší příklad, než slova:
    
    function ma_funkce($kolik_radku){
    // tato funkce u 3 radku Karel Gott vytahuje ze 3. sloupce zanry a haze je do jednoho radku
    //zvladne to i u Kabátů a 5 žánrů
    }
    
    
    $radku=mysql_num_rows($dotaz);
    if ($radku==0) echo "nic tu neni";
    else
    {
    	while ($zaznam=MySQL_Fetch_Array($vysledek)):
            	echo $zaznam["Interpret"]."
    \n";
            	echo $zaznam["Název skladby"]."
    \n";
            	echo $zaznam["Žánr"]."
    \n";
          	endwhile;
    }
    
    No a já potřebuji vymyslet tu podmínku u while, aby rozlišovala, že tam je teď 3x Karel Gott, tak zavolej má_funkce(3) nebo pro Kabáty má_funkce(5).

    Za JOIN díky.

    11.5.2011 10:48 VM
    Rozbalit Rozbalit vše Re: 1:N relace, jak se pracuje?
    ano, je přeci možné, aby jedna skladba měla více interpretů (zpívá: X feat Y). Dotaz jsem myslel takto: příklad PHP kódu jenž jsem dodal vypíše obsah spojených tabulek v toto tvaru:
    Karel Gott | Když muž se ženou snídá | pop
    Karel Gott | Když muž se ženou snídá | rock
    Karel Gott | Když muž se ženou snídá | blues
    já ale chci:
    Karel Gott | Když muž se ženou snídá | pop, rock, blues
    Co takhle:
    SELECT interpret_jmeno, skladba_nazev, GROUP_CONCAT(zanr_jmeno)
    FROM interpreti JOIN interpreti_skladby USING(interpret_id) 
        JOIN skladby USING(skladba_id)
        JOIN interpreti_zanry USING(interpret_id)
        JOIN zanry USING(zanr_id)
    GROUP BY interpret_id, skladba_id;
    
    BTW, neměl by žánr patřit spíše ke skladbě než k interpretovi?
    Josef Kufner avatar 16.5.2011 00:13 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: 1:N relace, jak se pracuje?
    Sloupeček vyjadřující relaci dej do té druhé tabulky. Pokud se do té druhé tabulky nehodí, přidej tabulku.

    V tvém případě přesuň sloupec "žánr" do tabulky se skladbama a pro získání interpretů s žánry uděláš:
    SELECT i.id_interpreta, i.jmeno,
        GROUP_CONCAT(DISTINCT z.nazev_zanru SEPARATOR ', ') AS zanry
    FROM interpreti i
    LEFT JOIN Skladby s ON s.id_interpreta = i.id_interpreta
    LEFT JOIN Zanry z ON z.id_zanru = s.id_zanru
    GROUP BY i.id_interpreta
    
    Hello world ! Segmentation fault (core dumped)
    16.5.2011 18:21 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: 1:N relace, jak se pracuje?
    Dobrý den, navrhuji si pro svůj malý webík databázi a potřebuji 1:N relace.
    Na nějaké studování joinů bych se "pro svůj malý webík" vykašlal, a místo toho použil rovnou nějaký ORM framework. Tam si jen řeknete jak mají vypadat objekty (záznamy) a starost o schema v DB jakož i insert/select/update/delete odpadá.

    In Ada the typical infinite loop would normally be terminated by detonation.
    Josef Kufner avatar 16.5.2011 19:46 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: 1:N relace, jak se pracuje?
    "Pro svůj malý webík" by spíš mělo smysl studovat nějaké hotové CMS než cokoliv jiného.
    Hello world ! Segmentation fault (core dumped)
    16.5.2011 21:31 CIJOML
    Rozbalit Rozbalit vše Re: 1:N relace, jak se pracuje?
    ja si to pro sebe kdyz delam databazove schema prelozim do ceske vety. Potom mas zajisteno, ze to vyjadruje to co potrebujes:

    1:1 jedno dite ma jen jedno rodne cislo a naopak jedno cislo nalezi jen jednomu diteti

    1:N jeden ucitel uci ve vice ucebnach a naopak v kazde ucebne uci vzdy jen jeden kantor

    M:N jedna zena muze spat s mnoha muzi a naopak mnoho muzu muze spat s mnoha zenami :D

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.