quba/ZPI — Issue #12: Nieprzezroczysta i nadmiarowa encja asocjacyjna UserPaper.
Author: lyzkov
Created: 2011-11-12 00:06:24+00:00
State: open
Labels: important, paperBundle

Klasa `UserPaper` została wprowadzona do projektu przez Kubę tylko dlatego, żeby zmniejszyć ilość tabel w bazie danych. Celem jej autora było zmniejszenie redundancji i zwiększenie szybkości działania bazy danych. Wcale jednak tak nie jest! Zaraz tłumaczę dlaczego...

Ogólna liczba rekordów jest taka sama, natomiast do schematu tabeli został wprowadzony atrybut rozróżniający dwa typy relacji (EDITOR i AUTHOR). Tu już jest pierwsza nadmiarowoć.
Kolejna nadmiarowość to konieczność przechowywania i przetwarzania przez framework zbędnych obiektór klasy `UserPaper`, gdyż teraz trzeba było utworzyć klasę encji dla tego powiązania.
Tak na prawdę relacje pomiędzy `User` a `Paper` nie mają żadnych cech (z punktu widzenia projektu), ponieważ wyciągając od danego użytkownika papiery nie chcemy nic wiedzieć na temat powiązania `User-Paper`. Cecha ozaczająca typ relacji została więc nadana sztucznie!
Teraz chcąc wyciągnąć z danego użytkownika papiery należy najpierw pobrać kolekcję niekomu nie potrzebnych obiektów UserPaper a dopiero potem z każdego obiektu `UserPaper` wyciągać `Paper`. Jest to spora niedogodność, gdyż za każdym razem trzeba pisać zapytanie używając `INNER JOIN`. W niektórych przypadkach bardzo to utrudnia pracę z Symfony i uniemożliwia korzystanie z niektórych ficzerów frameworka.

Ostatnią kwestią jest to, że np w encji `Paper` wciąż mamy pola: editors i authors mapowane przez tą samą relację. Oznacza to że mamy dwa pola z taką samą kolekcją obiektów `UserPaper`! Jak dla mnie zupełnie bez sensu.

Ja tu widzę dwa rozwiązania.
Pierwsze: wywalić encję `UserPaper`, wrócić do starego rozwiązania i cieszyć się brakiem redundancji.
Drugie: wywalić pola authors i editors i utworzyć jedno pole `usersPapers` oraz akcesory (wirtualne - tak to sobie teraz nazwałem) czyli np `getAuthors` które będą manipulowały polem `userPapers` i zwracały/pobierały odpowiednie obiekty klasy UWAGA: 'Users`.

Mogę się tym zająć, ponieważ mnie najbardziej ta kwestia interesuje w tej chwili. Chciałbym jedynie najpierw uzyskać jakąś sugestie i aprobatę moich działań.