[python] MySQL - nativní rozhraní pro Python
superman
feed na centrum.cz
Úterý Červenec 1 13:17:12 CEST 2008
On je základní problém, že databáze jsou relační, zatímco neustále se
různé frameworky snaží z toho udělat objektový přístup. A rozdíl mezi
těmito dvěma pojetí je tak značný, že objektový přístup nemůže být
efektivní.
Ale zase - každý luxus něco stojí a je třeba vědět, zda se vyplatí, nebo
ne. U objektového přístupu k relačním databázím je ten luxus (ztráta
rychlosti) velmi značný, a v zásadě se vyplatí jen tehdy, pokud a) máte
dostatečnou rezervu ve výkonu databáze, b) honíte tam přímo data z
jednotlivých tabulek, v krajním případě dvou přes cizí klíč.
Když to tak sleduji (o SQLAlchemy ani Django jsem nevěděl, ale studoval
jsem), tak se téměř nikomu tento převod, kdy se na relační databázi
dávám nějakým objektovým pohledem přes univerzální framework moc
nepovedl. Přiznám se sám, že asi to chce ten OOP interface vymyslet
jinak - to je můj vnitřní silný pocit. Na druhé straně musím uznat, že
pro jednoduché sáhnutí do tabulky je to velmi luxusní a dostačující.
On totiž SQL jazyk je dost schopný a různorodý a jdou tím až
neuvěřitelné zázraky. A nedokážu si dost dobře představit, že bych přes
framework hodil třeba to, co jsem teď stvořil (předem upozorňuji, že pro
databázi jde o velmi efektivní dotaz, který zpracuje v zanedbatelném čase):
SELECT plant_id,name,(SELECT name FROM plant_name AS n WHERE
n.plant_id=boss.plant_id AND language='lt' ORDER BY priority,type LIMIT
1) AS lt_name,(SELECT GROUP_CONCAT(o.cs_name ORDER BY
o.astrological_object_id SEPARATOR ',') FROM plant_astrological_object
AS o WHERE o.astrological_object_id IN (SELECT astrological_object_id
FROM plant_mn_object_plant AS rel WHERE rel.plant_id=boss.plant_id)) AS
objects FROM plant_name AS boss WHERE fulltext_name LIKE '%' AND
language IN ('cs') ORDER BY name COLLATE utf8_czech_ci
Přitom jde o velmi jednoduchý SQL dotaz, a asi bych si nedokázal
představit jak bych to nacpal přes framework.
Obrovská výhoda frameworků ale je - a to je jejich neskutečně silná
stránka, která se nedá pominout - že jsou nezávislé na konkrétním
databázovém stroji. Prostě znelíbí se vám databáze XY, tak jí prostě
vyměníte za jinou, a z hlediska aplikace se nic nemění. Všechny
závislosti na konkrétní databázi vyřídí framework sám - a kvůli tomu se
také velmi tyto abstrakční vrstvy používají. To je velmi častý důvod
jejich nasazení. Platí se za to ovšem ztrátou výkonu a někdy dost
značnou neefektivností ve složitějších datových případech.
Miloslav Ponkrác
Jirka Vejrazka napsal(a):
>> Kolega, nadšen "jednoduchostí" objektoveho pristupu k databazi a bez
>> hlubsich znalosti SQL udelal dotaz, ktery nad realnymi daty trval cca 16-20
>> sekund. Ja za pomoci SQL udelal dotaz, ktery generoval dataset cca 200-300
>> milisekund.
>>
>
> Souhlea, myslim ze nikdo neceka ze jakykoli framework bude stejne
> rychly a efektivni jako dobre napsane SQL. Zvlast pokud je to SQL
> (ne)zdrave vylepsene desitkami az stovkami hintu :)
>
> Pokud potrebuju pracovat s velkym mnozstvim dat (warehouse) a nebo
> potrebuju vyzdimat posledni kousek rychlosti z databaze (OTLP), pak se
> _dobre_ naucim SQL (a PL/SQL nebo T-SQL) a optimalizaci. Kdyz budu
> potrebovat udelat webovou aplikaci ktera pouziva databazi jako "neco
> kam hodim data a pak je tam relativne rychle najdu" a ma tam svych 25
> tabulek z nichz kazda ma max 8 sloupcu (a jsou celkem malo provazane),
> klidne sahnu po SQLAlchemy / Django / Pylons / TurboGears / .../ RoR
> (at nemluvime jenom o Pythonu ;-)
>
> Jirka
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
>
>
Další informace o konferenci Python