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í
×
včera 23:00 | Zajímavý článek

Richard M. Stallmanrozhovoru pro Opensource.com vysvětluje svou roli v návrhu standardu POSIX a vztah mezi projektem GNU a POSIX. V článku jsou pak vyjmenovány příklady funkcí nástrojů GNU, které byly do standardu přijaty.

Fluttershy, yay! | Komentářů: 0
včera 19:11 | Komunita

Nadace Blender Foundation oznámila, že společnost Epic Games vyvíjející počítačové hry věnuje v rámci svého programu Epic MegaGrants 1,2 milionu dolarů na vývoj svobodného 3D softwaru Blender.

Ladislav Hagara | Komentářů: 0
včera 11:44 | Zajímavý článek

Článek Co je Silverblue? na MojeFedora.cz odpovídá na otázky kolem tohoto projektu. Silverblue je oficiální název pro novou generaci desktopového operačního systému, dříve známého jako Atomic Workstation. Celý základní operační systém je v Silverblue dodáván ve formě obrazů, které jsou vytvářeny za použití projektu rpm-ostree. Hlavními přednostmi jsou jeho rychlost, bezpečnost, atomické aktualizace a neměnnost.

Ladislav Hagara | Komentářů: 8
včera 11:00 | Humor

Jak na uživatelsky přívětivý web? Projít si User Inyerface aneb UX peklo a nikdy nic z toho nepoužít.

Ladislav Hagara | Komentářů: 8
včera 10:22 | Zajímavý software

Byla vydána verze 0.6.0 textového editoru Amp inspirovaného editorem Vim a naprogramovaného v programovacím jazyce Rust. Přehled novinek na GitHubu.

Ladislav Hagara | Komentářů: 0
13.7. 18:44 | Nová verze

Bylo vydáno OpenHMD 0.3.0 s kódovým názvem Djungelvral. Jedná se o svobodný software pro podporu zařízení s HMD (Head-mounted display) pro pohlcující virtuální a rozšířenou realitu. Zdrojové kódy jsou k dispozici na GitHubu pod licencí Boost.

Ladislav Hagara | Komentářů: 0
12.7. 19:22 | Nová verze

Byla vydána nová verze 2019-07-10 linuxové distribuce Raspbian určené především pro jednodeskové miniaturní počítače Raspberry Pi. Přehled novinek v poznámkách k vydání. Společně s Raspbianem byl aktualizován také instalační nástroj NOOBS (New Out Of the Box Software). Nejnovější verze Raspbianu opravuje řadu chyb a vylepšuje podporu Raspberry Pi 4 Model B.

Ladislav Hagara | Komentářů: 0
12.7. 16:55 | Komunita

Na Steamu lze do pondělí 15. července získat počítačovou hru Age of Wonders III (Wikipedie) běžící také v Linuxu zdarma.

Ladislav Hagara | Komentářů: 1
12.7. 13:11 | Nová verze

Po čtyřech letech vývoje se blíží vydání verze 2.80 svobodného 3D softwaru Blender. Dnes byl vydán kandidát na vydání. Podrobný přehled novinek v oznámení o vydání. Zcela přepracováno bylo uživatelské rozhraní.

Ladislav Hagara | Komentářů: 0
12.7. 10:33 | Zajímavý software

Fabrice Bellard, tvůrce FFmpeg nebo QEMU, představil svůj nový projekt s názvem QuickJS. Jedná se o malý a přitom kompletní javascriptový engine. Zdrojové kódy jsou k dispozici pod licencí MIT [Hacker News].

Ladislav Hagara | Komentářů: 1
Používáte ještě 32bitový software na PC?
 (22%)
 (11%)
 (27%)
 (49%)
 (11%)
 (22%)
Celkem 37 hlasů
 Komentářů: 3, poslední dnes 07:31
Rozcestník

Ako (ne)používať stromy v djangu

4.5.2018 10:38 | Přečteno: 1441× | Programovanie | poslední úprava: 18.5. 18:37

Existuje mnoho knižníc pre django, ktoré riešia ukladanie stromov do relačnej databázy. Najpoužívanejšie sú django-mptt a django-treebeard. Doteraz som vždy používal django-mptt. Keď django-cms prešlo z mptt na treebeard rozhodol som sa, že začnem používat treebeard aj ja.

Prehľad spôsobu uloženia

django-mptt

Táto knižnica používa pre uloženie stromu 5 polí. Konrétne je to parent_id, lft, rght, level, a tree_id. Podrobne vysvetlený význam atribútov lft a rght je v tomto blogu. Výber podstromov, rodičov, ciest ... je pri tomto type stromu veľmi elegantný. Na druhej strane modifikácia stromu je dosť zložitá.

djang-treebeard

Treebeard implementuje niekoľko spôsobov uloženia stromu. Pozrime sa na preferovaný teda materialized path. V tabuľke nám pribudnú polia path, depth a numchild. Cesta sa skladá z ascii znakov, ktoré sa líšia v závislosti od použitej databázy. Cesty teda vyzerajú takto: 0000 (prvá položka), 0001 (druhá položka), 00010000 (prvý potomok druhej položky). Výbery sa uskutočňujú pomocou operátora LIKE. Inserty môžu vyžadovať prepísanie značnej časti ciest ak sa uskutočňujú blízko koreňa v hornej časti stromu. Vkladanie hlboko do stromu je pomerne rýchle.

Skúsenosti

S django-mptt pracujem dlho. Je to odskúšaná, stabilná, dobre zdokumentovaná knižnica. Na problémy s výkonom som ja osobne nenarazil, ale nerobím nič tak náročné, kde by sa to malo prejaviť. V dokumentácii je upozornenie na nutnosť obaliť operácie do transakcie (treba na to dávať pozor inak sa budú diať zlé veci).

Dokumentácia django-treebeard mi neprišla ktovie ako užitočná. V čase písania blogu bola neaktuálna a nereflektovala zmeny v zdrojových kódoch, takže som väčšinou skončil pri čítaní zdrojových kódov namiesto dokumentácie.

Prvý závažný problém, na ktorý som pri django-treebeard narazil na produkčnom serveri bolo zoradenie. Totiž používali sme slovenské texty a databáza mala nastavená collation na slovenčinu. Tá má však také špecifiká ako "CH", takže sa zoradenie podľa path rozbilo na prvý pohľad nepochopiteľným spôsobom. Varujem teda všetkých, ktorí by chceli použíavať django-treebeard - skontrolujte si na serveri collation pre stĺpec path, v prípade potreby ho zmnňte (ALTER TABLE tabulka ALTER path TYPE character varying(255) COLLATE "C"; v postgrese).

API django-treebeard je podľa mňa miestami obskurné, miestami nepoužiteľné a miestami oboje. Ako príklad uvediem rendervoanie stromu v šablóne - django-treebeard. Atribút close je pekne obskurný a ako bonus obsahuje čísla 0..n (teda nie level ktorý daný záznam zatvára). Vďaka tomu nie je možné napríklad vyrenderovať strom, ktorý by mal v druhej úrovni trochu inú štruktúru než v prvej. Pre titeto prípady som si musel napísať filter, ktorý do close doplní level.

@register.filter_tag
def add_level(items):
    for __, info in items:
        info['close'] = [info['level'] - c for c in info['close']]
    return items

Pre porovnanie django-mptt to má vyriešené pomocou tagu recurstree, takže nie je potrebné nič dohackovať.

Ďalej som dnes zistil, že django-treebeard nie je schopný vyrenderovať formulár s vlastným layoutom (to fakt nikto za tú dobu nepotreboval?), pri zobrazení formulára generuje cez 10 000 selectov (ah hlanve, že sa autor chváli benchmarkami) ...

Moje odporúčanie teda znie - kašlite na to, čo je práve populárne. Používajte radšej to, čo je dobré. Ja zatiaľ skúsim pretlačiť pár svojich úprav do django-treebeard ;)

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Vložit další komentář

Josef Kufner avatar 4.5.2018 14:03 Josef Kufner | skóre: 68
Rozbalit Rozbalit vše Re: Ako (ne)používať stromy v djangu
Stromy v SQL databázi pomocí Nested Sets (parent_id, tree_left, tree_right, tree_depth, a tree_root_id) používám dlouho a funguje to skvěle. Není to stavěné na časté vkládání a modifikace obecně, ale jinak to je velice elegantní a praktický způsob uložení stromu, který umožňuje jedním selectem vytáhnout cokoliv je potřeba – podstrom, všechny rodiče ke kořeni, potomky, sousedy.

Teoreticky sice stačí jen left a right, ale je robustnější používat primárně parent_id, na kterém není co zkazit, a ty ostatní 4 hodnoty si dopočítat. Hloubka se hodí pro jednodušší vykreslování stromu. ID kořene pak umožní optimalizovat aktualizace left a right při úpravách stromu (pokud je v DB mnoho malých stromů je pak rychle, neboť se přepočítá jen jeden).
Hello world ! Segmentation fault (core dumped)
ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.