Какая стратегия доступа к данным для большого приложения
-
08-07-2019 - |
Вопрос
Я собираюсь переписать приложение VB6 в .NET 3.5sp1. Приложение VB6 написано довольно хорошо, а уровень данных полностью основан на хранимых процедурах. Я хотел бы пойти с чем-то автоматизированным, как Linq2SQL / Entity Framework / NHibernate / SubSonic. По общему признанию, я не использовал ни один из этих инструментов ни в чем кроме одноразовых проектов. Р>
Потенциальная проблема, с которой я могу столкнуться при выборе, - это скорость. Например, сейчас, чтобы извлечь одну строку (или весь список), я использую следующий sproc:
ALTER PROCEDURE [dbo].[lst_Customers]
@intID INT = NULL
,@chvName VARCHAR(100) = NULL
AS
SELECT Customer_id, Name
FROM dbo.Customer
WHERE (@intID IS NULL OR @intID = Customer_id)
AND (@chvName IS NULL OR Name like ('%' + @chvName + '%'))
ORDER BY name
Чтобы извлечь одну строку в Linq2SQL / Entity Framework / NHibernate / SubSonic, нужно ли этим решениям довести весь список до клиента и найти нужную мне строку?
Итак, каков консенсус в отношении стратегии доступа к данным для приложения с большой областью данных?
Решение
Я собираюсь сыграть адвоката дьявола и рекомендую, по крайней мере, рассмотреть возможность придерживаться хранимых процедур. Они представляют собой фрагмент кода, который вам не нужно переписывать и отлаживать. Эта статья из нашего очень собственного [tm] Джоэла Спольски приводит последовательный аргумент в пользу избегать полной перезаписи.
Если у вас есть проект «с нуля», вы можете использовать то, что хотите, и O / R Mapper вполне может быть хорошим выбором. Тем не менее, вы уже заявили, что приложение VB6 хорошо написано. Если sprocs хорошо написан, то вы получаете часть своего приложения бесплатно, и оно уже отлажено, плюс вы можете переработать схему базы данных и избежать большинства проблем при переносе данных.
Шаблоны архитектуры корпоративных приложений Фаулера должен дать вам несколько полезных указателей для проектирование уровня доступа к данным, который будет хорошо играть с хранимыми процедурами, не вызывая проблем с обслуживанием.
Это делается довольно часто в приложениях Oracle / Java. Многие устаревшие приложения Oracle имеют большой объем кода хранимых процедур на PL / SQL - это была стандартная архитектура еще во времена клиент-сервер Oracle Forms. Обычной практикой является написание оболочки для sprocs в Java и создание пользовательского интерфейса поверх оболочки.
Один из других авторов упомянул, что Subsonic может создавать оболочки для звездочек. Р>
Давным-давно у меня была возможность взломать словарь данных, который сгенерировал проверочную концепцию Java / JDBC-обертку для sprocs PL / SQL - IIRC это заняло всего один день или около того. Учитывая, что это не так сложно сделать, я был бы удивлен, обнаружив, что нет ничего особенного в том, что вы можете сделать с полки, чтобы сделать это. В крайнем случае, написание собственного тоже не так сложно.
Другие советы
Я не могу говорить о Linq-to-SQL, Entity Framework или NHibernate, но я влюблен в SubSonic. Мой опыт с этим был в целом положительным.
Как правило, эти инструменты работают так, что они создают для вас параметризованные запросы в управляемом коде, инкапсулируют этот доступ в классы, а затем предоставляют эти классы вашим приложениям. Полностью сгенерированный DAL-рок.
Используя параметризованные запросы, вы беспокоитесь о том, что им может потребоваться довести весь список до клиента и найти нужную мне строку " обрабатывается. Они поддерживают предложения where
и другую фильтрацию, чтобы получить только те строки, которые вам нужны. Вы можете сделать эквивалент select * from foo
, но вы не застряли в этом режиме.
Тем не менее, SubSonic - когда используется из коробки для прямого доступа к таблице / представлению - удаляет целые строки, что может быть недостатком в некоторых сценариях. Тем не менее, ваш доступ через хранимые процедуры не является проблемой - я не могу говорить с другими, но SubSonic услужливо создает класс SPs
, инкапсулирующий все ваши процессы, позволяя вам вызывать их как методы, и возвращает соответствующие DataTable
, которые затем можно анализировать вручную при необходимости. Существуют также способы инициализации списков классов DAL из procs, поэтому, если proc возвращает набор данных, который напрямую соответствует таблице / представлению, вы все равно можете иметь более чистый синтаксис без ручной обработки.
(SubSonic, между прочим, вылечил меня от «процедур для всего». Сейчас я, как правило, почти не трачу времени на CRUD-процессы, как это делал в прошлом, и использую их только для сложных отчетов. Но ваш пробег может варьироваться.)
Я бы порекомендовал использовать SubSonic для генерации всего кода для доступа к существующим хранимым процессам, таким образом вы уменьшите шансы регрессии благодаря новому уровню доступа к данным. Затем к любым новым функциям можно получить доступ с помощью классов ActiveRecord, созданных SubSonic. Мне кажется, это самый безопасный и быстрый подход,
Я не согласен с рекомендацией NHibernate, потому что она не очень подходит для работы с хранимыми процедурами.
Мы попытались использовать сущностную инфраструктуру в качестве формы и столкнулись с множеством проблем, когда пытались использовать ее в разработке, управляемой доменом. У Linq to Sql также есть некоторые ограничения, и Microsoft, по-моему, перестанет поддерживать его в следующем выпуске.
Если запросы хранятся в хранимых процедурах, есть большая вероятность, что они уже были оптимизированы. И, вероятно, они свободно используют выражения SQL для JOINS, подзапросов и т. Д.
Дублирование такого рода эффективности и выразительности, точно , со слоем абстракции типа ORM, я ожидаю, будет проблемой, особенно если вы не совсем знакомы с инструментами.
Вы всегда можете выполнить рефакторинг запросов после того, как получите остальную часть приложения. И мир ORM меняется достаточно быстро, поэтому варианты, безусловно, будут отличаться, когда вы туда доберетесь.
SubSonic, даже по словам Роба Коннери, одного из авторов, написан больше для поддержки быстрой разработки приложений, а не для больших приложений. Я бы сказал, что вы можете использовать NHibernate, поскольку вы найдете наибольшую поддержку со стороны сообщества, а также проверенные и проверенные фреймворки. Вы можете получить полезную информацию от www.dimecasts.net о настройке вашего NHibernate.