1

Temat: Komentarze do różnych obiektów - jakie relacje?

Jest baza książek i baza autorów. Książki są przypisane autorom, wszystko działa świetnie.

Teraz chcę mieć możliwość dodawania komentarzy do tych pozycji. Jednak komentarz można dodać zarówno do książki, jak i do autora. Czyli chcę skomentować daną książkę lub danego autora.

Pytanie: jakich relacji użyć? Zakładam, że komentarz powinien zawierać dwie kolumny w bazie: ksiazka_id oraz autor_id W zależności, czy komentarz jest do książki czy autora, to jedno z dwóch pól będzie miało wpis, drugie będzie puste.

Jasne wydaje mi się, że ze strony książek i autorów relacja to będzie hasMany komentarz. Natomiast w drugą stronę logiczne wydaje się belongsTo, jednak czy wtedy CakePHP nie będzie wymuszał, iż każdy komentarz będzie musiał należeć zarówno do książki jak i do autora?

Ostatnio edytowany przez Tony (2009-01-12 17:26:07)

2

Odp: Komentarze do różnych obiektów - jakie relacje?

Propozycja: tabela komentarze: id,fk,text
tabela typy: id,typ (np: 1,autor; 2,artukul)

Latwiej wtedy przeszukiwac i jest logiczniejsze ze wzgledu na baze. findAll(fk=1) v findAll(types.type = 'autor')

Komentarze belongsTo Artykul a kartykul hasMany komentarze.

3

Odp: Komentarze do różnych obiektów - jakie relacje?

Dzięki, ale IMO już lepiej do tabeli komentarze dodać typ, czyli powiedzmy byłyby w sumie 2 kolumny: belongsto_id i belongsto_type i w tym drugim trzymać 1=autor, 2=ksiazka, ewentuanie byłoby miejsce na dalsze elementy serwisu (3, 4, 5 itd.).

Tylko to już jest "ręczne" kombinowanie z tymi powiązaniami, a ja chciałbym oprzeć się na domyślnych rozwiązaniach cakephp. Czy zostaje mi tylko hasAndBelongsToMany?

4

Odp: Komentarze do różnych obiektów - jakie relacje?

Sorki ale nie bardzo zrozumialem o co teraz Tobie chodzi sad

To co napisalem to jest dokladnie to samo co i ty ;P Kolumna fk spelnia to samo zadanie co belongsto_type ;]

Nie widze powiazania hasAndBelongsToMany w twoim przypadku. Posiadal bys tylko dwie tabelki i one okreslaly by dokladnie czy komentarz jest do artykulu czy do autora.

PS: Sorki faktycznie zapomnialem o jednej kolumnie w komentarzach powinno byc tak:

Kom: id,type,fk,text
Typ: id,name
Art: id, autor_id,text.

Na moje oko wszedzie jest powiazanie jeden do wielu. Autor/Artykul -> Komentarz <-Typ.
Problem zrodzi się jezeli komentarz mialby byc jednoczesnie do autora i do artykulu ale to chyba nie logiczne ;]

Jakbym nadal nie kapowal oco chodzi w Twoim problemie - pisz ;]

Ostatnio edytowany przez duke_piotr (2009-01-13 11:09:50)

5

Odp: Komentarze do różnych obiektów - jakie relacje?

Dzięki za pomoc. Generalnie po próbach zadziałało doskonale takie rozwiązanie, gdy mam 2 kolumny ksiazka_id oraz autor_id i one obie są jako belongsTo odpowiednio książki i autora. CakePHP łyka to bez problemu, bake odpowiednio tworzy widoki i kontrolery.

Zostanę przy tym rozwiązaniu, bo CakePHP obsługuje to doskonale. Jednak zastanawiam się, czy nie jest ono po prostu bardzo dobre, przy założeniu, że w tych kolumnach może być null, wtedy rekordy nie powinny zajmować wiele miejsca, mimo, że zawsze jedna z tych pozycji jest pusta. Przy zaindeksowaniu obu kolumn wydaje się, że będzie to działało zdecydowanie szybciej, niż stworzenie dodatkowej kolumny z typem rodzica, do którego przyporządkowany jest komentarz.

6

Odp: Komentarze do różnych obiektów - jakie relacje?

przy setce czy tysiacu rekordow mozliwe - przy duzych bazach raczej nie. Generalnie zasada jest nie tworzenie pustych pol.

7

Odp: Komentarze do różnych obiektów - jakie relacje?

W takim razie czy da się zrobić tak, aby przy pieczeniu (bake) Cake załapało te powiązania od razu należycie przy konstruowaniu kontrolera i widoku? Jak powinien wyglądać model?

8

Odp: Komentarze do różnych obiektów - jakie relacje?

To juz pytanie do darka big_smile

9

Odp: Komentarze do różnych obiektów - jakie relacje?

Ogólnie cake sobie ładnie radzi z rozpoznawaniem powiązań jeśli trzymamy się konwencji nazewniczej co do tabel w bazie. Tak więc jeśli mamy powyższą sytuację to baza powinna wyglądać mniej więcej tak:

books: id, name, author_id, date_of_issue ...
authors: id, name, surname, birth_date, ...
comments: id, book_id, author_id, title, content, created ...

W przypadku gdy tabele mają angielską nazwę w liczbie mnogiej a klucze obce postać pojedynczą z suffixem "_id", to Cake sam postara się zaproponować relacje między nimi. Np. w tabeli books znajdzie author_id i postara się powiązać te tabele proponując prawdopodobnie relację Book belongs to Author (gdy bake'ujesz tabele books) i analogicznie Author has Many Book (w przypadku bake'owania tabeli authors).

Co do komentarzy - wszystko zależy od tego jak miałaby aplikacja wyglądać w przyszłości. Jeśli ma się pojawić opcja dodawania komentarzy do innych modeli, to rozwiązanie powyższe będzie zbyt mało elastyczne. Większe możliwości da coś podobnego do:
comments: id, model_name, model_id, title, content, created ...
ale niestety Cake nie stworzy sobie automatycznie powiązań, i komentarze trzeba będzie wyciągać ręcznie.

Pozdrawiam

Ostatnio edytowany przez darek_dobron (2009-01-14 11:24:23)

10

Odp: Komentarze do różnych obiektów - jakie relacje?

darek_dobron napisał/a:

Ogólnie cake sobie ładnie radzi z rozpoznawaniem powiązań jeśli trzymamy się konwencji nazewniczej co do tabel w bazie. Tak więc jeśli mamy powyższą sytuację to baza powinna wyglądać mniej więcej tak:

books: id, name, author_id, date_of_issue ...
authors: id, name, surname, birth_date, ...
comments: id, book_id, author_id, title, content, created ...

Dzięki, dokładnie tak miałem i to sprawdza się świetnie wraz z bake. Chodziło mi o bake w przypadku, gdy mamy model_name i model_id.

11

Odp: Komentarze do różnych obiektów - jakie relacje?

darek_dobron napisał/a:

books: id, name, author_id, date_of_issue ...
authors: id, name, surname, birth_date, ...
comments: id, book_id, author_id, title, content, created ...

Tylko co zrobisz gdy dojdzie 3 tabela do ktorej mozna dodawac komenatre, powiazana z ksiazkami ( logicznie) np publishers (wydawcy)
podazajac za ta konwecja bedziemy miec  : comments: id, book_id, author_id, publisher_id, title, content, created ...

Jest znosnie, ale gdy dojdzie nam 4 i 5 tabela, rowniez "komentowalna" nie zwiazana z porzednimi 3 , zeby zachowac logike, trzeba bedzie
utworzyc 2 tabele, lub dolyzc kolejne pola...

Troche bezsensu wydaje się zaproponowana prze autora wątku struktura tabeli. Komentujesz książkę i/lub dokonania autora. A nie dokonia autora który napisał tę książkę - wtedy komentujesz samą książkę i komentarz do autora jest zbędny.

Mozna sporobowac tak :
books: id, name, author_id, date_of_issue ...
authors: id, name, surname, birth_date, ...
comments: id, model, model_id,  title, content, created ... - gdzie model jest polem "enum" zawieraacym nazwy modeli np "Book","Author","Publisher" a model_id to klucz obcy z odpowiedniego modelu.


Dla przykladu :
id       model       model_id       title       content
1        Author      12                 ...         ...
2        Author      13                 ...         ...
3        Publiser    1                   ...         ...
4        Book        7                   ...         ...

Prosto i przyjemnie.

Żeby nie odbiegać od pytania :

class Author extends AppModel {
    var $hasMany = array(
        'Comment' => array(
            'className'  => 'Comment',
            'conditions' => array('Comment.model' => 'Author')
        )
    );
}


class Book extends AppModel {
    var $hasMany = array(
        'Comment' => array(
            'className'  => 'Comment',
            'conditions' => array('Comment.model' => 'Book')
        )
    );
}

Ostatnio edytowany przez robal77 (2009-03-23 16:13:57)

12

Odp: Komentarze do różnych obiektów - jakie relacje?

Proponowal bym podobnie lecz zamiast ENUM z modelem dodatkowa tabele ze spisem modeli, mozna ich dodawac wtedy ile sie chce nie niszczac struktury(zmieniajac dozwolone ENUM).

PS: dowiedzialem sie gdzies ze ENUM nie jest CAKE Friendly i lepiej go jak narazie nie uzywac ;] Chodzi o to ze pola enumerycznie nie sa uzywane we wszystkich bazach danych obslugiwanych przez cake'a.

13

Odp: Komentarze do różnych obiektów - jakie relacje?

duke_piotr napisał/a:

PS: dowiedzialem sie gdzies ze ENUM nie jest CAKE Friendly i lepiej go jak narazie nie uzywac ;] Chodzi o to ze pola enumerycznie nie sa uzywane we wszystkich bazach danych obslugiwanych przez cake'a.

Zgadza sie enum nie jest np obslugiwany przez oracle, ale czy to dla kejka jakas roznica, skoro i tak znajdzie wartosc ktorej szukal ? Oracle rowniez nie obsluguje autoincement (podobnie jak pgsql uzywa sekwencji) znanego min z mysql ... czy to powod zeby go nie stosowac ? wink

Btw ... dodatkowa tebla wymusi stosowanie kolejnej asocjacji, tylko po to zeby zrobic to samo co jedna tebla z polem enum, czy tez textowym z nazwa modelu wink

Ostatnio edytowany przez robal77 (2009-03-23 16:42:07)