Komentáře k více typům obsahu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Arynev
Člen | 33
+
0
-

Ahoj,
je to poměrně oříšek, ale jak nejlépe navrhnou tabulky pro komentáře k více typům obsahu?

Zatím mi asi nejschůdnější přijdou dvě varianty:

  • pro každý typ obsahu vlastní komentáře
  • jedna tabulka pouze s „id“ (AI) a k ní tabulka pro komentáře
  • jedna tabulka pro komentáře ve které budou sloupce object enum (např „article“,„page“), object_id

Jsem spíš pro druhou variantu, teď ale nastává pravý problém. Jak vypsat seznam nejnovějších komentářů a k nim jednoduše odkazy? Samozřejmě u komentáře budu chtít zobrazit titulek.

Díky za názory, odpovědi.

pepakriz
Člen | 246
+
0
-

Co takhle vytvořit jednu tabulku pro obsah, k této tabulce potom vázat další typy obsahů a též komentáře? V Doctrine by šla udělat entita, která reprezentuje záznam k tabulce obsahu. Další Entita pro jiný typ obsahu by v konstruktoru pouze vytvořila asociaci oneToOne na obsahovou entitu a přidala by si své další sloupečky. Ve finále by existovaly tři tabulky. Obsahová, na kterou by se lepily další tabulky (Typová, která by rozšiřovala Obsahovou entitu (OneToOne) a potom komentáře, které by se lepily též na obsahovou ManyToOne).

Arynev
Člen | 33
+
0
-

Myslím že oba myslíme to samé :), ale…

Má např takovouto strukturu databáze
obrázek

Jak nyní vyberu všechny komentáře a k nim titulek (title se u některých typů může přejmenovat) pomocí Nette\Database? Je tato struktura správná? Jaké nevýhody má?

mkoubik
Člen | 728
+
0
-

pepakriz napsal(a):

To OneToOne je právě „zlozvyk“ z relačního návrhu. Pohodlnější je použít dědičnost (class Article extends Commentable), Doctrine pak dělá automaticky INNER JOIN. Pak stačí vytáhnout komentáře a k nim přiřazené commentables a linky generovat podle $comment->commentable instanceof Article atd.

Arynev
Člen | 33
+
0
-

A jak nejjednodušeji vytáhnu commentables s co nejméně dotazy?

mkoubik
Člen | 728
+
0
-

SELECT c FROM \Commentable c, jak se to přeloží do SQL už záleží na metodě reprezentace dědičnosti. Viz http://www.doctrine-project.org/…mapping.html.

Editoval mkoubik (29. 11. 2011 20:35)

bojovyletoun
Člen | 667
+
0
-

můžeš se podívat tu a te a to

rovnou bych zavrhl a)enum a b)pro každý typ svoji tabulku

Další věc je, zda jde o doctrine, notorm, sql?

pepakriz
Člen | 246
+
0
-

mkoubik napsal(a):

Pokud řeším modulární strukturu, tedy že nějaké CMS bude mít obecnou entitu stránky, pak dědění u Doctrine nelze použít, jelikož základní entita musí o jeho potomku vědět. A nebo mě něco uniklo? Proto jsem psal o řešení pomocí OneToOne. http://www.doctrine-project.org/…mapping.html

mkoubik
Člen | 728
+
0
-

Například u singletable o potomcích vědět nemusí.

Patrik Votoček
Člen | 2221
+
0
-

Né nutně. Nella CMS je postavená na Class Table Inheritance. A využívá ho „do mrtě“.

Já CMS 1.x používám vlastní listenery, které tohle „obcházejí“. Nicméně díky https://github.com/…Listener.php se to dá použít o dost snadněji.

pepakriz
Člen | 246
+
0
-

Patrik Votoček napsal(a):

Nicméně díky https://github.com/…Listener.php se to dá použít o dost snadněji.

Jestli jsem ve vteřině správně pochopil účel, zařizuje mi automatické zjištění potomků. Tak to je hodně drsné, až budu mít trochu času, mrknu na to.

Arynev
Člen | 33
+
0
-

Jak to vypadá, tak přejít z Nette\Database na Doctrine je asi nejjednodušší řešení. V NotORM se to jednoduše vyřešit nedá aniž bych při procházení foreach hledal každá záznam zvlášť

Vlastně ne, já class table inheritance použil jen částečně. Ten titulek mám nacpat do commentable a je to v pořádku. Pak odstranit z ostatních tabulek id(AI) a používat pouze id z commentable. Bude to však znamenat používání triggerů.

Co když titulek budu generovat ze dvou tabulek, které jsou komentovatelné?

Editoval Arynev (30. 11. 2011 10:04)

Fanda
Člen | 39
+
0
-

Když jsem tohle řešil a záleželo mi na vazbě, udělal jsem více sloupců (pro každou komentovanou entitu). Že je to ale nejlepší netvrdím. :-)
Že má komentář alespoň jednu vazbu lze v postgresql ověřit pomocí CHECK.