Я здебільшого погоджуюся з відповіддю Діме про те, що ви хочете створити свої моделі за кожним бізнес-об'єктом - проблеми, які намагається вирішити бізнес, повинні впливати на створення модельних класів. На практиці я виявив, що створення однієї моделі за столом - це гарне місце для початку. Правильно розроблена схема, ймовірно, імітує бізнес-процеси, які потрібно моделювати в коді програми - також називається Доменна модель.
Використання шару об'єктово-реляційного картографування корисно, щоб ваша модель домену містила ті ж відносини, що і схема бази даних, без необхідності повторюваних викликів до рівня доступу до даних. Ознайомтеся з красномовним прикладом для PHP. І схема, і модель домену повинні бути розроблені для підтримки бізнес-процесів.
Це призводить до першої частини відповіді Мар'яна Венеми:
Я кажу, що модель за столом просто відтворює вашу базу даних в структурі класів. Він відомий як анемічна модель і вважається антидіаграмою.
Домен Модель анемічний є анти-патерн. "Модель за таблицею", як вважає Венема, може розглядатися як "відтворення вашої бази даних", проте абсолютно невірно сказати, що це лише Anemic Domain Model.
Від Мартіна Фаулера:
Основний симптом анемічної доменної моделі полягає в тому, що спочатку рум'яна виглядає як справжня річ. У доменному просторі є об'єкти, багато яких названі іменами, і ці об'єкти пов'язані з багатими відносинами та структурою, які мають справжні доменні моделі. Зловживання відбувається, коли ви дивитесь на поведінку, і ви розумієте, що навряд чи є поведінка на цих об'єктах, що робить їх трохи більше, ніж мішків геттерів та сетерів.
(наголос, мій)
Ключовим фактором анемічної моделі домену є відсутність поведінки чи методів у класах Доменної моделі.
Це тому, що класи покликані мати як дані, так і поведінку. Якщо ви обмежуєте свої моделі однією таблицею, куди ви ставите код (поведінку), який потребує обробки даних та поведінки з кількох таблиць?
Знову ж таки, ви можете і потрібно вводити поведінку у ваші доменні моделі, навіть якщо вони відображають лише одну таблицю. Поведінка, яка впливає на кілька таблиць, дійсно впливає на кілька об'єктів, які трапляються для відображення в декількох таблицях. Дизайн, керований доменом, - це підхід до точно тієї ж проблеми, про яку згадувала Венема: "куди ви ставите код (поведінку), який потребує обробки даних та поведінки з кількох таблиць?
І відповідь - сукупний корінь . Мартін Фаулер заявляє:
Агрегат - це модель у дизайні, керованому доменом. Сукупність DDD - це кластер об’єктів домену, який можна розглядати як єдину одиницю. Прикладом може бути замовлення та його позиції. Це будуть окремі об'єкти, але корисно трактувати замовлення (разом із його позиціями) як єдиний сукупність.
(наголос, мій)
"Кластер об'єктів домену" також може розглядатися як "Доменні моделі, які відображають у кілька таблиць". Поведінка, яка впливає на декілька таблиць, повинна визначатися в агрегованому корені - класі, який інкапсулює "річ", яка впливає на кілька таблиць або об'єктів:
Знову від Мартіна Фаулера:
Сукупність часто буде містити неоднозначні колекції разом з простими полями.
Щоб відповісти на оригінальне запитання ОП:
... Чи вважати створення моделі на основі таблиці баз даних гарною практикою? Таким чином методи не пишуться двічі.
Я б сказав, що це хороше місце для початку, але пам’ятайте, що ваша схема та об’єктна модель не повинні відповідати 100%. Об'єктна модель повинна більше стосуватися впровадження та виконання правил бізнесу. Схема повинна бути більш орієнтована на зберігання бізнес-даних модульним та масштабованим способом.
Модель на контролері не була б хорошою практикою, хоча існує версія моделі під назвою View Model, яка вписується в рівень Controller. View Model є реорганізація моделі предметної області , щоб відповідати певний вид дисплея, будь то веб - сторінки або форми в додаток з графічним інтерфейсом.