Какая стратегия доступа к данным для большого приложения

StackOverflow https://stackoverflow.com/questions/284889

Вопрос

Я собираюсь переписать приложение 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top