Hirdetés

Keresés

Hirdetés

CyberSecurity Connect - blended learning, valódi labor kísérletezésre. Kiberbiztonsági képzés profiktól!
(használd a CYBSEC25PH kuponkódot további 20 ezer ft kedvezményért!)

Új hozzászólás Aktív témák

  • nyunyu

    félisten

    válasz Taci #5051 üzenetére

    És ha jól értem, ugye azt írod, hogy csináljak egy product_category táblát, amibe úgy kerülnének bele a rekordok, hogy ha a fő táblámban (product) mondjuk van 2 millió rekord, és mindegyikhez tartozik 2-4 (átlagban 3) kategória (category). Akkor e szerint a product_category táblában jelen állás szerint 6 millió rekord lenne.

    Nem ez a lényeg, hanem az, hogy a kategória táblád párszáz, ezer rekordos lesz csak.
    Ezen a string műveletek időigénye még nem tragikus, gyorsan le tudja kérdezni kategórianevekhez tartozó ID-t.
    Aztán abból már könnyen joinolja a többmilliós product_category táblát (ha tettél indexet a category_id-re), így hamar megvan a product_id, ami meg szintén külső kulcs, a product tábla elsődleges kulcsára mutat, ami megint csak indexelt, aztán máris megvannak a megfelelő termék rekordjaid.

    Feltételezem, hogy valami webshop motort hegesztesz, ahol a vevő a termék kategóriára is tudna szabadszövegesen keresni, ezért kell a kategória névre string illesztés.

  • nyunyu

    félisten

    válasz Taci #5051 üzenetére

    N:M kapcsolatnak pont az a lényege, hogy külön-külön lekérdezhető mindegyik variációja.

    Teszemazt van egy product táblád:
    id name
    1 alma
    2 körte
    3 banán
    4 szilva
    5 narancs

    van egy categoryd:
    id name
    1 piros
    2 sárga
    3 zöld
    4 kék
    5 narancssárga

    Ezeket összerendelő product_category táblád:
    product_id category_id
    1 1
    1 2
    1 3
    2 2
    3 2
    4 4
    5 1
    5 5

    Ha erre ráuszítod az előző querymet c.name like '%sár%'-ral, akkor ki fogja neked listázni az almát, körtét, banánt, narancsot, mert azok SÁRga vagy narancsSÁRga kategóriásak.

    Ha azt akarod kérdezni, hogy melyik az a termék, amiből van sárga és piros is, akkor kétszer kell a product_category-t és a categoryt joinolni, és azokat ANDdal kérdezni:
    select p.*
    from product p
    join product_category pc1
    on pc1.product_id = p.id
    join category c1
    on c1.id = pc1.category_id
    join product_category pc2
    on pc2.product_id = p.id
    join category c2
    on c2.id = pc2.category_id
    where c1.name = 'sárga' and c2.name = 'piros'
    order by p.date desc;

    Ez már csak az almát találná meg.

    Ha ezt írnád:
    where c.name = 'sárga'
    or c.name = 'piros'
    or c.name = 'kék'

    vagy az ezzel ekvivalens
    where c.name in ('sárga','piros','kék')
    feltételt, akkor az összes sárga vagy piros vagy kék gyümölcs lejönne (alma, körte, banán, szilva)
    Narancs nem, mert itt kategórianévre teljes egyezés a feltétel!

  • martonx

    veterán

    válasz Taci #5051 üzenetére

    "És ha jól értem, ugye azt írod, hogy csináljak egy product_category táblát, amibe úgy kerülnének bele a rekordok, hogy ha a fő táblámban (product) mondjuk van 2 millió rekord, és mindegyikhez tartozik 2-4 (átlagban 3) kategória (category). Akkor e szerint a product_category táblában jelen állás szerint 6 millió rekord lenne."

    Ez azért tud gyors lenni, mert ezek mind Foreign Key-ek, azaz indexeltek. Itt tenném még hozzá, hogy sokkal tisztább érzés lenne Kategória ID-re szűrni Name helyett.

Új hozzászólás Aktív témák