Vlákno názorů k článku PHP okénko: Spojování tabulek od Petr Bravenec - U takto jednoduchého příkladu se to dá omluvit,...

  • Článek je starý, nové názory již nelze přidávat.
  • 11. 4. 2005 8:10

    Petr Bravenec (neregistrovaný)

    U takto jednoduchého příkladu se to dá omluvit, ale pokud to má být "ukázkový" příklad, pak je to naprostá trotlovina. Velké množství dotazů se používá na několika místech - jednou se ze stejných dat generuje třeba ceník pro internetového uživatele, podruhé se ze stejných dat generuje ceník pro prodejce, doplněný o možnosti změn. Pro podobné příklady bych použil zásadně VIEW. To je předem připravený dotaz, uložený přímo v databázi, a na všech místech programu poskytující pokaždé stejná data. Pokud se později provádějí změny do struktury tabulek, stačí opravit dotaz na jediném místě - v databázi - a do programů se promítnou změny bez zásahu programátorovy ruky.

    Takže "odstrašující řešení" je skutečně odstrašující, "za určitých okolností přijatelné řešení" je odstrašující a nakonec "správné řešení" je v kontextu ukázkového příkladu taky odstrašující.

    Vzorový příklad by měl vypadat v databázi takto:

    CREATE VIEW vyrobky_view AS
    SELECT vyrobky.id, vyrobky.nazev, skupiny.nazev AS skupina_nazev 
    FROM vyrobky 
    INNER JOIN skupiny ON vyrobky.skupina = skupiny.id
    

    a v PHP takto:

    // správné řešení 
    $result = mysql_query("SELECT * FROM vyrobky_view WHERE podminka"); 
    while ($row = mysql_fetch_assoc($result)) { 
        echo "<a href='?id=$row[id]'>$row[nazev]</a>"
               .($row[skupina_nazev])<br/>\n"; 
        }
    mysql_free_result($result);
    

    Pokud databáze MySQL nezvládá VIEW, pak by se na projekty, obsahující více než jednu tabulku, vůbec neměla používat.

  • 11. 4. 2005 19:50

    Vladimir Kralik
    > Pokud databáze MySQL nezvládá VIEW, pak by se na projekty,
    > obsahující více než jednu tabulku, vůbec neměla používat.
    Neviem ako MySQL, poznam (trochu) Informix.
    Tam sice VIEW existuje, ale s jeho realnym pouzitim je to horsie :-(.

    Uvedeny priklad by Informix realizoval na dva kroky takto :
    """select * from vyrobky_view where podmienka"""
    1.) vytvor join vo vyrobky_view do docasnej tabulky
    2.) na docasnu tabulku aplikuj "podmienku"

    V pripade, ze join vyrobky X skupiny da niekolko miliononov riadkov, tak sa vysledku nedockate, hoci "podmienka" vyberie iba par riadkov.

    > Pro podobné příklady bych použil zásadně VIEW.
    Ak si chcem zachovat nezavislost od pouzitej DB, tak sa nebudem spoliehat na ziadne specialitky z DB-servera a na strane aplikacneho servera si zakryjem DB-vrstvu vhodnym objektovym mapovanim. V mojom pripade (Java) je riesenim Hibernate.
  • 12. 4. 2005 6:10

    Petr Bravenec (neregistrovaný)
    Jo, jasně. Já na všecko používám Postgres, který view zvládá velice dobře - uvedenou podmínku by v tomto jednoduchém konkrétním příkladě aplikoval přímo při výběru dat do view a bylo by to stejně rychlé jako v případě konkrétního dotazu. Postgres jsem se naučil využívat pokud možno co nejvíce. Skutečně to velmi usnadňuje práci. Ovšem view bych nepovažoval za nějakou specialitu. View zvládaly uspokojivě i databáze, se kterými jsem pracoval před více než deseti lety.

    Nezávislost na použité databázi je možná pěkná věc, ale zeptám se takto: kolik lidí vytváří aplikace, které musí běhat nezávisle na SQL stroji v Postgresu, Ingresu, Accessu, MySQL a Foxpro? "Nezávislost" je u drtivé většiny programátorů výmluva, aby se nemuseli učit nic složitého a mohli jít s davem.