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 04:44 | Komunita

    Ubuntu 26.10 bude Stonking Stingray (úžasný rejnok).

    Ladislav Hagara | Komentářů: 1
    včera 22:22 | Nová verze

    Webový prohlížeč Dillo (Wikipedie) byl vydán ve verzi 3.3.0. S experimentální podporou FLTK 1.4. S příkazem dilloc pro ovládání prohlížeče z příkazové řádky. Vývoj prohlížeče se přesunul z GitHubu na vlastní doménu dillo-browser.org (Git).

    Ladislav Hagara | Komentářů: 1
    včera 21:55 | Komunita

    Byl publikován přehled dění a novinek z vývoje Asahi Linuxu, tj. Linuxu pro Apple Silicon. Vývojáři v přehledu vypíchli vylepšenou instalaci, podporu senzoru okolního světla, úsporu energie, opravy Bluetooth nebo zlepšení audia. Vývoj lze podpořit na Open Collective a GitHub Sponsors.

    Ladislav Hagara | Komentářů: 0
    25.4. 04:00 | Nová verze

    raylib (Wikipedie), tj. multiplatformní open-source knihovna pro vývoj grafických aplikací a her, byla vydána ve verzi 6.0.

    Ladislav Hagara | Komentářů: 0
    24.4. 18:33 | IT novinky

    Nové verze AI modelů. Společnost OpenAI představila GPT‑5.5. Společnost DeepSeek představila DeepSeek V4.

    Ladislav Hagara | Komentářů: 0
    24.4. 15:33 | Zajímavý článek

    Nová čísla časopisů od nakladatelství Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 164 (pdf) a Hello World 29 (pdf).

    Ladislav Hagara | Komentářů: 0
    24.4. 04:44 | Komunita

    Bylo oznámeno, že webový prohlížeč Opera GX zaměřený na hráče počítačových her je už také na Flathubu and Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    23.4. 23:11 | IT novinky

    Akcionáři americké mediální společnosti Warner Bros. Discovery dnes schválili převzetí firmy konkurentem Paramount Skydance za zhruba 110 miliard dolarů (téměř 2,3 bilionu Kč). Firmy se na spojení dohodly v únoru. O část společnosti Warner Bros. Discovery dříve usilovala rovněž streamovací platforma Netflix, se svou nabídkou však neuspěla. Transakci ještě budou schvalovat regulační orgány, a to nejen ve Spojených státech, ale také

    … více »
    Ladislav Hagara | Komentářů: 0
    23.4. 22:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 26.04 LTS Resolute Raccoon. Přehled novinek v poznámkách k vydání. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 11. vydání s dlouhodobou podporou (LTS).

    Ladislav Hagara | Komentářů: 2
    23.4. 11:55 | Nová verze

    V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Gitea (Wikipedie) byla vydána v nové verzi 1.26.0. Přehled novinek v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (8%)
     (2%)
     (13%)
     (31%)
     (4%)
     (7%)
     (2%)
     (15%)
     (25%)
    Celkem 1427 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    Dotaz: 1:N relace, jak se pracuje?

    10.5.2011 10:16 petrrrr
    1:N relace, jak se pracuje?
    Přečteno: 1495×
    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.