Mapowanie danych i relacje: strategie wdrażania?

Prawie skończyłem mój Data Mapper, ale teraz jestem w punkcie, w którym dochodzi do relacji.

Spróbuję tutaj zilustrować moje pomysły. Nie udało mi się znaleźć dobrych artykułów / informacji na ten temat, więc może wymyślam koło (na pewno jestem, mógłbym po prostu użyć dużej struktury - ale chcę się tego nauczyć).

Relacje 1: 1

Po pierwsze, spójrzmy na relacje 1: 1. Ogólnie rzecz biorąc, gdy mamy klasę domeny o nazwie „Firma” i klasę „Adres”, nasza klasa firmy będzie miała coś takiego jak adres_id. Powiedzmy, że w większości przypadków wyświetlamy tylko listę Firm, a adres jest potrzebny tylko wtedy, gdy ktoś patrzy na szczegóły. W takim przypadku mój Mapper danych (CompanyDataMapper) po prostu ładuje się leniwie, co oznacza, że ​​po prostu pobierze ten adres_id z bazy danych, ale nie wykona połączenia, aby uzyskać dane adresowe.

Ogólnie rzecz biorąc, mam metodę gettera dla każdego związku. W tym przypadku istnieje metoda getAddress (Company companyObject). Przyjmuje obiekt firmy, szuka jego właściwości adresu i - jeśli jest NULL - pobiera odpowiedni obiekt Address z bazy danych, używając klasy Mapper dla tego obiektu Address (AddressDataMapper), i przypisuje ten obiekt adresu do właściwości adresu określonej obiekt firmy.

Ważne: Czy program mapujący dane może używać innego programu mapującego dane?

Powiedzmy, że w większości przypadków potrzebujesz zarówno obiektu firmy, jak i obiektu adresu, ponieważ zawsze wyświetlasz go na liście razem. W tym przypadku CompanyDataMapper nie tylko pobiera obiekty firmowe, ale wykonuje zapytanie SQL za pomocą JOIN, aby również uzyskać wszystkie pola obiektu adresu. Na koniec iteruje zestaw rekordów i podaje nowe obiekty odpowiadającymi im wartościami, przypisując obiekt adresu do obiektu firmy.

Jak na razie brzmi prosto.

1: n Relacje

Co powiesz na te? Jedyna różnica w stosunku do 1: 1 polega na tym, że firma może mieć wiele obiektów adresów. Spójrzmy na to: kiedy jesteśmy najbardziej zainteresowani Firmą, Mapper danych po prostu ustawi właściwość adresów obiektu firmy na NULL. Właściwość address jest tablicą, która może odwoływać się do żadnego, jednego lub wielu adresów. Ale jeszcze nie wiemy, ponieważ ładujemy leniwie, więc jest po prostu NULL. Ale co, jeśli w większości przypadków potrzebowalibyśmy wszystkich adresów? Jeśli wyświetlilibyśmy dużą listę ze wszystkimi komputerami wraz ze wszystkimi ich adresami? W tym przypadku sprawy zaczynają być naprawdę brzydkie. Po pierwsze, nie możemy dołączyć do tabeli adresów pięćdziesiąt razy dla każdego obiektu adresu (mocno wierzę, że to niemożliwe, a jeśli tak, wydajność będzie poniżej zera). Tak więc, kiedy pomyślimy o tym dalej, niemożliwe jest NIE ładować się leniwie w tym przypadku.

Ważne: czy to prawda? Czy muszę wysłać 100 zapytań, aby uzyskać 100 obiektów adresowych, jeśli mam 10 firm z 10 adresami?

m: n Relacje

Powiedzmy, że obiekt adresu zawiera tylko numer kraju, stanu, miasta, drogi i domu. Ale jeden dom może być wielką wieżą biznesową z wieloma firmami. Jak jeden z tych nowoczesnych biurowców, gdzie każdy może wynająć mały rom, aby pokazać tę wieżę na swojej stronie internetowej. Tak więc: wiele firm może udostępniać ten sam adres.

Nie mam jeszcze planów, aby rozwiązać ten problem.

Ważne: Prawdopodobnie nie jest to większy problem niż relacje 1: n?

Jeśli ktoś zna dobre źródło informacji, które omawia szczegóły dotyczące rozwiązania / wdrożenia, byłbym szczęśliwy z powodu linku!

questionAnswers(3)

yourAnswerToTheQuestion