Databaza - komentare k objektom

Sekcia: Programovanie 09.08.2011 | 12:07
Avatar Miroslav Bendík Gentoo  Administrátor
Ahojte, pripravujem jeden linuxový portál a tak rýpem trochu do databáz a chcem vytvoriť databázový model tak, aby bol pekelne rýchly a poskytoval lepšie funkcie ako teraz na LinuxOS. V konečnom dôsledku by som chcel nový systém nasadiť na LinuxOS a dosiahnuť tak výrazne vyšší výkon, nové čistejšie užívateľské rozhranie (prechod z dvojpanelovej verzie na jednopanelovú, rozšíriť miesto pre správy ...). Experimentujem práve s rôznymi servermi, JIT kompilátorom, minimalizáciou objemu prenášaných dát ... chcel by som dosiahnuť minimálnu odozvu bez osekávania funkcionality. K tomu patrí prirodzene aj správny návrh databázy, takže trochu načrtnem problém a riešenia, ktoré ma napadlo.

Rád by som k článkom, blogom, vo fóre ... proste k jednotlivým objektom databázy priradil systém komentárov. Komentáre teda aby boli jednoznačne priraditeľné k iným databázovým objektom musia obsahovať cudzí kľúč a typ objektu. Ak hovoríme o článkoch ako o objektoch tak tie sú prirodzene číslované (1, 2, 3 ...), ale rovnaké číslovanie budú mať aj blogy, takže aby bol komentár priraditeľný musí obsahovať nie len cudzí kľúč (FK), ale aj typ objektu.

Napadli ma k tomuto problému 3 riešenia.
  1. Vytvorenie tabľky komentárov s id objektu a typom objektu v primárnom kľúči
    • ORM, ktoré používam nemá podporu joinov, ktoré nie sú pomocou FK, takže nemôžem urobiť niečo ako JOIN diskusia.obj_id = clanok.id AND diskusia.obj_typ = "clanok"
    • Nie je to práve najčistejšie riešenie (nebudú tam definované FK)
    • )Lahko realizovateľné fulltext vyhľadávanie
  2. Vytvorenie samostatnej tabuľky diskusie pre každý typ objektu
    • ľahko realizovateľné pomocou ORM, ktoré používam (pomocou abstraktného modelu a dedičnosti)
    • Jednoduché čisté FK
    • Pri zmene štruktúry je nutné zmeniť niekoľko tabuliek
    • Fulltext s unionmi (pomalé ako teraz, ale nie je až tak podstatné, viz. odstavec o fulltext vyhľdávaní)
  3. Zavedenie jednoznačného ID entitám, čo je ralizovateľné rôznymi spôsobmi:
    1. Vytvorením sekvencie a pridaním ďalšieho jednoznačného ID ku každej entite, ktorá má mať komentár
      • Škaredé riešenie, ale realizovateľné pomocou FK
      • Nie je relizovateľné vo všetkých DBS
    2. Vytvorenie tabuľky, v ktorej budú naraz články, eshop, blogy ... proste taká tabuľka pre všetko, niečo ako wp_content
      • Veľmi ľahko relizovateľný fulltext
      • Realizovateľné pomocou FK, modely s vlastným managerom
      • Jednoduchý fulltext
      • Hrozná správa, managovateľnosť, neprehľadné
    3. Vytvorenie tabuľky obsahujúcej len ID diskusie a pridanie FK na túto tabuľku jednotlivým entitám
      • Prístup cez FK
      • Nutnosť zavedenia tabuľky navyše
      • Nie práve najpríjemnejšia správa

Ako databázu by som rád použil postgresql, ktorá má aj pri veľkej záťaži fakt skvelý výkon. Ak by mysql vymenil za postresql nebolo by možné urobiť fulltext vyhľadávanie v databáze. Na druhej strane rád by som na vyhľadávanie namiesto databázy použil rovnako ako na abclinuxu Lucene. V takom prípade sú moje výhrady k vyhľadávaniu totálne irelevantné.

Ak máte nejaké argumenty pre / proti, prípadne poznáte nejaké iné možnosti sem s nimi ;)
    • Re: Databaza - komentare k objektom 09.08.2011 | 12:18
      Avatar Miroslav Bendík Gentoo  Administrátor
      PS. sorry eMDi, že takto píšem ako keby to bola hotová vec, ale nejako som ťa nemohol kontaktovať na maile, takže píšem na fórum to, čo pripravujem.

      PPS. Ak hovorím o zvýšení výkonu nového CMS nepôjde len o nejaké kozmetické zmeny, ale dúfam aj prepis do iného jazyka, iná databáza, konečne poriadny vyhľadávací engine ... Experimentujem momentálne s djangom, podľa benchmarkov vyzerá, že by to mohlo s JIT slušne rozdupať systémy založené na PHP, rovnako Postgresql vs MySQL. Inak ešte trochu z histórie Shakal CMS, tento názov sa mi celkom páči a nový systém by som chcel nazvať Shakal-NG (hoc názov takmer rovnaký ide o kompletný prepis všetkého). Tento systém som robil dávno a dovtedy som mal prax s PHP asi mesiac, celkovo keď som tu začínal mal som počítač asi pol roka. Ak hovorím, že dokážem niečo napísať lepšie zvyčajne nekecám hoc by som kvôli tomu mal spávať dve hodiny denne.

      Toľko informácie na dnes, idem ja zatiaľ pracovať, prajem príjemný zvyšok dňa.
      • Re: Databaza - komentare k objektom 09.08.2011 | 16:20
        Avatar Milan Dvorský debian,mint kde,android  Administrátor
        nuz, ja neviem, co si mam o tom celom uz mysliet, ze ides trochu s krizkom po funuse, ked si sam nepamatas poriadne veci, ktore si programoval ... ale to uz je jedno. drzim palce.
    • Re: Databaza - komentare k objektom 09.08.2011 | 12:45
      Avatar bedňa LegacyIce-antiX  Administrátor
      Ja osobne to riešim tak, že dávam každú vec do extra tabuľky. Takže by som pre fórum, články, správičky, blogy a komentáre spravil extra tabuľky. Keď potom dávam dotaz na fórum, nemusí engine zaťažovať filtrovanie článkov, správičiek atď. Poďalšie nemusím nejakým obskurtným spôsobom luštiť kľúče.

      PS: Sa začali vracať staré páky, čo sa deje :)
      Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
      • Re: Databaza - komentare k objektom 09.08.2011 | 12:47
        Avatar Miroslav Bendík Gentoo  Administrátor
        Ale akurát som dokončil vysokú školu, takže konečne trochu voľna. Cez vyšku a iné projekty, ktoré som mal rozrobené som proste nemal čas na nič ;)
    • Re: Databaza - komentare k objektom 09.08.2011 | 15:26
      WlaSaTy   Návštevník
      Neuveríš, ale tá trojka je najjednoduchšia z hľadiska údržby a najprehľadnejšia z pohľadu návrhu. Tá zdanlivá neprehľadnosť vyplýva len z presvedčenia že každý typ objektu musí mať vlastnú neprerušovanú sekvenciu ID. A toto nedosiahneš ani na komerčných databázach, keďže sekvencer drží hodnotu v pamäti pokiaľ nedosiahne potrebu ktorá ho prinúti uložiť sa na disk. Ale, absencia seqencera môže mať za následok trošku vyšší load keď budeš riešiť select max(seq_id)+1 from blah a neodpamätáš si to do tabuľky emulujúcej samotný objekt sekvencer.

      Inak, ja skôr vidím iný problém. Zamykanie záznamov v referenčných tabuľkách a rekonštrukcia konzistentnosti záznamov pri (ehm nazvime to) reštarte. Ale, to závisí od konkrétneho databázového engine.
      • Re: Databaza - komentare k objektom 09.08.2011 | 18:29
        Avatar Miroslav Bendík Gentoo  Administrátor
        Dík za info. Vzhľadom na to, že v django pre použitie tohto prístupu postačuje niečo takéto:
        from django.db import models
        from shakal.comments.models import CommentsAbstract
        
        class Article(models.Model):
          title = models.CharField(max_length = 200)
          body = models.TextField()
        
        class ArticleComments(CommentsAbstract):
          article = models.ForeignKey(Article)
        
        vyzerá byť toto ako najschodnejšia cesta.
    • Re: Databaza - komentare k objektom 09.08.2011 | 16:23
      Avatar borg Fedora  Administrátor
      to je sice pekne, ale na virtualke maximum nedosiahnes.
    • Re: Databaza - komentare k objektom 09.08.2011 | 18:15
      Avatar Róbert Dúbravský PC Debian alebo Ubuntu - servery Debian  Používateľ
      Ahojte,

      Čo dodať, paráda :)
    • Re: Databaza - komentare k objektom 14.08.2011 | 18:27
      Avatar Miroslav Bendík Gentoo  Administrátor
      Nechce sa mi kvôli tomu zakladať novú tému, takže nejaké screenshoty z toho, čo je hotové (žiaľ nemám moc času, len cez víkendy a aj to robievam na rôznych projektoch) ... takže frontend, backend a ešte raz backend.