Korzystam z Codeigniter i znalazłem się w podobnej sytuacji, w której powtórzyłem metody Model. Tworzę model dla kontrolera. Ale czy tworzenie modelu według tabeli bazy danych byłoby uważane za dobrą praktykę? W ten sposób metody nie są pisane dwukrotnie.
Zamiast modelu na kontroler lub kilku małych modeli, które są współużytkowane.
Przykład, jeśli mam metodę modelową get_user ($ user_id), mógłbym napisać ją na users_models.php ...
Jedną z wad, jakie widzę, jest to, że być może będę musiał wywołać kilka modeli, a nie tylko controlername_models.php.
Czy załadowanie kilku modeli, w których nie można zastosować kilku metod ze sterownika, może wpłynąć na wydajność i szybkość? Jaki może być najlepszy sposób rozwiązania tego problemu?
Uwaga: Istnieją podobne pytania, ale nie obejmują one podstaw Modelu według tabeli bazy danych.
źródło
Zasadniczo należy tworzyć modele nie dla tabeli lub dla kontrolera, ale dla obiektu biznesowego. Czasami może to być relacja 1: 1 ze strukturą tabel lub kontrolerami, ale nie jest to konieczne.
W twoim przykładzie możesz mieć jedną
users_model
klasę wywoływaną z kilku kontrolerów. To jest w porządku, a czasem nawet pożądane. Jednak w większości przypadkówusers_model
klasa otrzyma dane z kilku tabel.Na przykład
last_login_date
właściwośćusers_model
klasy można ( nie trzeba ) uzyskać z oddzielnejuser_audit
tabeli, która ma relację jeden do wielu zusers
tabelą główną .Powiedziałbym, że jeśli masz jedną tabelę SQL na obiekt biznesowy, najprawdopodobniej struktura bazy danych nie jest znormalizowana.
źródło
W większości zgadzam się z odpowiedzią Dime'a, że chcesz tworzyć modele dla każdego obiektu biznesowego - problemy, które firma próbuje rozwiązać, powinny determinować sposób tworzenia klas modeli. W praktyce odkryłem, że dobrym pomysłem jest stworzenie jednego modelu na stół. Prawidłowo zaprojektowany schemat prawdopodobnie naśladuje procesy biznesowe, które należy modelować w kodzie aplikacji - zwanym także modelem domeny.
Korzystanie z warstwy mapowania obiektów / relacji jest przydatne, dlatego model domeny zawiera te same relacje co schemat bazy danych bez potrzeby powtarzalnych wywołań do warstwy dostępu do danych. Sprawdź Eloquent dla PHP jako przykład. Zarówno schemat, jak i model domeny powinny być zaprojektowane do obsługi procesów biznesowych.
To prowadzi do pierwszej części odpowiedzi Marjana Venema:
Anemic Domain model jest anty-wzór. „Model na tabelę”, jak sugeruje Venema, może być postrzegany jako „odtwarzanie bazy danych”, jednak absolutnie niepoprawne jest twierdzenie, że sam jest anemicznym modelem domeny.
Od Martina Fowlera:
(podkreślenie, moje)
Kluczowym czynnikiem w anemicznym modelu domeny jest brak zachowania lub metod w klasach modelu domeny.
Ponownie, możesz i powinieneś umieścić zachowanie w swoich modelach domen, nawet jeśli są one mapowane tylko do jednej tabeli. Zachowanie, które wpływa na wiele tabel, naprawdę wpływa na wiele obiektów, które przypadkiem są mapowane na wiele tabel. Domain Driven Design to podejście do dokładnie tego samego problemu, o którym wspomniał Venema: „gdzie umieszczasz kod (zachowanie), który musi radzić sobie z danymi i zachowaniem z wielu tabel?”
Odpowiedź brzmi: Korzeń zagregowany . Martin Fowler stwierdza:
(podkreślenie, moje)
„Klaster obiektów domenowych” można również wyświetlić jako „Modele domenowe odwzorowane na wiele tabel”. Zachowanie, które wpływa na wiele tabel, powinno być zdefiniowane w katalogu głównym agregacji - klasa, która zawiera „rzecz”, która wpływa na wiele tabel lub obiektów:
Ponownie od Martina Fowlera:
Aby odpowiedzieć na oryginalne pytanie PO:
Powiedziałbym, że jest to dobre miejsce na rozpoczęcie, ale należy pamiętać, że twój schemat i model obiektowy nie muszą się zgadzać w 100%. Model obiektowy powinien bardziej koncentrować się na wdrażaniu i egzekwowaniu reguł biznesowych. Schemat powinien bardziej koncentrować się na przechowywaniu danych biznesowych w sposób modułowy i skalowalny.
Model na kontroler nie byłby dobrą praktyką, chociaż istnieje odmiana modelu o nazwie Model widoku, który pasuje do warstwy Kontrolera. Widok Model jest reorganizacja modelu domeny, aby dopasować pewien rodzaj wyświetlacza, czy jest to strona internetowa lub forma w aplikacji GUI.
źródło