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 17:33 | Zajímavý článek

    Joe Brockmeier z Linux Weekly News vyzkoušel různé forky webového prohlížeče Mozilla Firefox: především GNU IceCat, Floorp, LibreWolf a Zen. V článku shrnuje, v čem se liší od výchozí konfigurace Firefoxu, co mají za vlastní funkcionalitu, jak a kým jsou udržované atd.

    Fluttershy, yay! | Komentářů: 0
    včera 19:22 | Nová verze

    Byl vydán Debian 12.10, tj. desátá opravná verze Debianu 12 s kódovým názvem Bookworm. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.

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

    Byla vydána nová verze 4.5 svobodného notačního programu MuseScore (Wikipedie). Představení novinek v oznámení v diskusním fóru a také na YouTube.

    Ladislav Hagara | Komentářů: 0
    včera 17:00 | Nová verze

    Byla vydána nová verze 8.6.0 správce sbírky fotografií digiKam (Wikipedie). Přehled novinek i s náhledy v oficiálním oznámení (NEWS). Nejnovější digiKam je ke stažení také jako balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo ke spuštění a spustit.

    Ladislav Hagara | Komentářů: 0
    včera 04:44 | Komunita

    O víkendu probíhá v Praze na Karlově náměstí 13 konference Installfest 2025. Na programu je celá řada zajímavých přednášek a workshopů. Vstup je zdarma. Přednášky lze sledovat i online na YouTube.

    Ladislav Hagara | Komentářů: 1
    14.3. 22:11 | Nová verze

    Byla vydána nová verze 2.49.0 distribuovaného systému správy verzí Git. Přispělo 89 vývojářů, z toho 24 nových. Přehled novinek v příspěvku na blogu GitHubu a v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    14.3. 19:00 | IT novinky

    Premiér Petr Fiala (ODS) dnes na síti X vyloučil, že by za jeho vlády mohla začít platit vyhláška, podle níž by poskytovatelé internetového připojení měli uchovávat adresy internetových stránek, na které se lidé připojují.

    Ladislav Hagara | Komentářů: 4
    14.3. 12:33 | Komunita

    Flock 2025, tj. konference pro přispěvatele a příznivce Fedory, proběhne od 5. do 8. června v Praze.

    Ladislav Hagara | Komentářů: 0
    13.3. 17:29 | Komunita

    Zemřel Mark Klein, který dlouhá léta pracoval pro telekomunikační firmu AT&T a proslavil se jako whistleblower, když zveřejnil informace o spolupráci AT&T s agenturou NSA. Cílem spolupráce bylo sledovat veškerou komunikaci občanů za pomocí zařízeních v místnosti 641A. O spolupráci obou subjektů napsal knihu Wiring Up The Big Brother Machine...And Fighting It.

    Max | Komentářů: 0
    13.3. 16:33 | Nová verze

    Byla vydána nová verze 16 integrovaného vývojového prostředí (IDE) Qt Creator. Podrobný přehled novinek v changelogu.

    Ladislav Hagara | Komentářů: 0
    Jaké je vaše preferované prostředí?
     (27%)
     (1%)
     (1%)
     (1%)
     (1%)
     (2%)
     (64%)
     (2%)
    Celkem 145 hlasů
     Komentářů: 5, poslední 13.3. 11:45
    Rozcestník

    Dotaz: 1:N relace, jak se pracuje?

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