Code-First или Database-First, как выбрать? - PullRequest
40 голосов
/ 28 мая 2009

Предположим, мы собираемся запустить новый проект - приложение, содержащее некоторую бизнес-логику, пользовательский интерфейс в ASP.NET, WPF или оба из них. Мы хотели бы использовать генератор кода ORM или DAL и реализовать нашу бизнес-логику в классах .NET. Существует несколько основных способов выражения наших идей в области бизнеса:

  • Реализация бизнес-классов в .NET и позволить ORM генерировать соответствующую схему базы данных
  • Создание схемы базы данных вручную и создание классов .NET с помощью генератора кода
  • Используйте какой-нибудь визуальный дизайнер, который может генерировать бизнес-классы и структуру базы данных или скрипт

Что вы предпочитаете писать: «Создать табличных людей (...)» или «открытый класс Person {...}»?
Каковы плюсы и минусы этих способов?
Может быть, есть особые ситуации, когда один путь лучше другого?
Как выбрать оптимальный путь в конкретном проекте?

Я хорошо знаком с способом «Code-First» (или «Model-First»), но кажется, что большинство ORM спроектированы как генераторы кода или преобразователи, которые предполагают, что я буду вручную реализовывать как структуру базы данных, так и бизнес-классы .

Особенно приветствуются ответы, основанные на опыте и примерах ORM.

Редактировать: Обратите внимание: вопрос не в том, «Что мне делать в первую очередь при запуске нового проекта?», А в том, «Что должно быть объявлено / автоматически создано, классы домена или структура базы данных?»

Ответы [ 11 ]

12 голосов
/ 28 мая 2009

Я думаю, что подходящий подход к системному анализу и проектированию - начать с моделирования ваших объектов и отношений между ними в первую очередь. Если вы создаете библиотечную систему, вы должны думать о фразах Book, Author, Publisher, ISBN как об объектах, а не о таблицах или атрибутах базы данных. Я считаю, что так и должно быть. Тем не менее, давайте признаем, что генераторы кода экономят много времени, и им требуется реляционная база данных для генерации модели и ее отображения в объектах БД. Я думаю, что это основная причина, по которой разработчики склонны начинать с D.B. Что может подтвердить мою точку зрения, так это то, что разработчики генераторов кода изо всех сил пытаются обратить вспять осуществляемую в настоящее время операцию (т. Е. Вы предоставляете бизнес-модель объектов и классов - и генератор создает для этого БД с соответствующей схемой).

Редактировать:
Вот пример генераторов первого домена (сама ADO.NET Entity Framework) Модель First :

Visual Studio 2010 должна иметь возможность генерировать DDL и создавать базу данных для хранения модели данных сущностей. Разработчик имеет полный контроль над всем процессом, имея возможность настраивать DDL, выбирать желаемую базу данных или точно настраивать процесс отображения.

9 голосов
/ 28 мая 2009

Почему не первый интерфейс?

Слишком много приложений начинаются с менталитета программы. Это плохая идея. Программирование - это самый тяжелый компонент построения приложения, то есть оно самое дорогое и сложное для изменения. Вместо этого сначала начните с проектирования.

Дизайн относительно легкий. Бумажный набросок дешевый и его легко заменить. HTML-дизайны все еще относительно просты для изменения (или выбрасывания). Это не относится к программированию. Проектирование во-первых делает вас гибким. Программирование сначала защищает вас и настраивает на дополнительные расходы.

Это из Глава 9 из Получение реального по 37 сигналам.

6 голосов
/ 28 мая 2009

«Покажи мне свои блок-схемы и скрой свои таблицы, и я буду продолжать мистифицировать Покажите мне свои таблицы, и мне обычно не нужны ваши блок-схемы; они будут очевидны ».

- Фред Брукс в «Мифическом человеко-месяце»

4 голосов
/ 28 мая 2009

На мой взгляд, нет правильного ответа на это. Я думаю, это в основном сводится к вашим личным предпочтениям или предпочтениям вашей команды. Все упомянутые подходы (сначала база данных, сначала код, сначала интерфейс) имеют свои преимущества и недостатки.

Я бы, вероятно, сел с ручкой и бумагой и набросал общую структуру и основные функции приложения, прежде чем делать что-то конкретное, будь то код или таблицы базы данных. Простое рисование основного пользовательского интерфейса также очень помогает.

3 голосов
/ 29 мая 2009

Чтобы ответить на ваш отредактированный вопрос (ручные дб / авто классы или ручные классы / дб), я бы выбрал «ни один». Автогенерируемый код обоих видов следует избегать по ряду причин, прежде всего YAGNI. В итоге вы получите код, который никогда не писали, но тем не менее несете ответственность, код, который вы никогда не будете использовать, и (по моему опыту) код, в итоге вы потратите больше времени на рефакторинг, чем если бы вы разработали и написали его самостоятельно в первом место. И оба они держат ваш фокус далеко от самого важного местоположения - пользователя.

3 голосов
/ 29 мая 2009

В большинстве случаев это не имеет большого значения. Это больше зависит от личных предпочтений и навыков, чем все остальное. Большинство приложений не сильно пострадают в любом случае, используйте то, что нравится вашей команде. Там, где выбор действительно важен, должно быть очевидно, какой подход выбрать.

Тем не менее, мое личное мнение таково, что "база данных сначала", как правило, является более безопасным выбором. Если данные каким-либо образом важны, особенно если они важны за пределами вашего конкретного приложения, вы хотите иметь полный контроль над тем, как они хранятся.

«Сначала код» (подразумевается: передача базы данных в руки какого-то автоматического инструмента), на мой взгляд, действительно является ярлыком, который вы должны использовать, когда (и только когда) вы точно знаете, что можете с этим справиться.

3 голосов
/ 28 мая 2009

Сначала анализ требований, а затем некоторая документация по этим потребностям и обзор аспектов данных этого?

Затем вы знаете, какие данные вы будете собирать и как они связаны с другими данными, и сможете разработать схему базы данных или структуру данных для ее сопоставления (в виде логических объектов / таблиц связанного содержимого, а не «tab1_data», «tab2_data» msgstr "соответствует процессу сбора данных, который может измениться, но вы это знаете!). Вы могли бы даже спроектировать .xsd сначала и сгенерировать код и схему базы данных из этого. В наши дни все весело и игры, в зависимости от ваших навыков.

Поскольку схема базы данных в моем сознании хранит данные, и это действительно важная вещь для бизнеса, я хотел бы спроектировать это сначала - несколько инструментов могут получить к ней доступ вовремя, возможно, оригинальная система будет заменена на линия (например, переход на новые инструменты / языки / интерфейсы). Если вы ничего не знаете о теории баз данных, то, возможно, это не самый лучший вариант, но я все равно получу проверку любой сгенерированной схемы кем-то другим.

1 голос
/ 10 июля 2018

Моделирование предметной области против реляционного моделирования

Существует несколько основных способов выражения наших идей в области бизнеса

Я думаю, что важно сначала установить, что домен не зависит от конкретных технологий и / или парадигм программирования (например, OO, FP, реляционный). В этом ответе предполагается, что вы уже определили свой домен отдельно, например, используя методы DDD, и теперь хотим использовать реляционную базу данных для ее хранения.

Сильные стороны реляционной модели

Реляционная модель была изобретена, среди прочего, для устранения многих проблем, которые были вызваны предыдущими моделями, включая сетевую модель (которая включает в себя модели OO), иерархическую модель (включая модели XML / JSON) или простые хранилища значений ключей. Он имеет много преимуществ по сравнению со всеми альтернативами, что делает его таким популярным на протяжении десятилетий.

По моему мнению, эти сильные стороны указывают на то, что вам следует создать модель базы данных внутри базы данных, которая была создана именно для этой цели. Все остальные модели, включая вашу клиентскую модель, являются копиями этой оригинальной , реляционной модели из базы данных. Таким образом, все остальные модели должны быть получены из него, а не source для него.

См. Реляционную модель, выраженную в DDL, как ваш источник истины

XSD - это то же самое

XML / XSD - аналогичная технология. Ваши данные выражаются в терминах XML, но когда две системы взаимодействуют друг с другом через API на основе XML, XSD (или, например, WSDL, если хотите) является наиболее подходящим языком для определения этой связи.

Если вы хотите привязать свои XML-документы с помощью клиентской технологии, например, JAXB в Java, тогда вы должны генерировать эти классы JAXB из XSD, а не наоборот. Зачем? Потому что XSD является источником истины

Я уже писал об этой теме здесь .

1 голос
/ 28 мая 2009

Начните с того, что не будете думать напрямую о «модели» (желательно на бумаге), какие части будут иметь ваше приложение с точки зрения пользователей.

Если у вас есть четкое представление об этой модели, вы можете разделить части на общие и конкретные маленькие элементы, которые вы можете перевести как в определения объектов, так и в таблицы базы данных.

Я считаю, что этот метод позволяет значительно сократить время и усилия по нормализации базы данных.

0 голосов
/ 18 октября 2011

Есть 3 важных аспекта, которые необходимо учитывать при разработке приложения базы данных ...

  1. Пользовательский опыт
  2. Качество данных
  3. Стоимость поддержки первых двух (пользовательский опыт и качество данных)

Я полагаю, что приоритет этих трех элементов выражен в порядке их представления, то есть наивысшим приоритетом является пользовательский опыт, вторым по важности является качество данных, а третьим - это стоимость. Конечно, это можно обсудить, но понятие кода сначала или базы данных сначала относится к третьему приоритету - стоимости. Каким бы ни был выбор - сначала напишите код или базу данных, убедитесь, что выполнены первые два приоритета ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...