Почему Не Стоит Использовать Двухуровневую Архитектуру При Разработке Клиент-Серверных Приложений

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

В противном случае статья просто не увидела бы свет. Суть данной лабораторной работы заключалась в написании n-го числа валидаций, хранимых процедур и триггеров на MS SQL. Все триггеры, валидации и хранимые процедуры очень простые, но это только первая лаборатория и дальше будет хуже, будут многоуровневые SQL запросы и хранимые процедуры очень большого объёма.

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

Все приложения имеют бизнес-логику и подлежат постоянному масштабированию и изменению.

А привязывать все к базе данных не правильно, так как может возникнуть ряд проблем, которые невозможно решить, используя только СУБД в качестве серверной части.

Примерами таких проблем могут быть:

  • Необходимо использовать другую базу данных
  • Необходимость вывода данных в нескольких типах для разных клиентских сторон (JSON, HTML, XML и т.д.)
  • Добавление и изменение таблиц, столбцов или изменение их названий, что повлечет за собой изменение всего, что связано с каждой таблицей или столбцом.

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



Давайте рассмотрим типичный пример, что нам нужно отправить письмо по электронной почте.

Как это выглядит, если отправить сообщение через MS SQL
   

DECLARE @tableHTML NVARCHAR(MAX) ; SET @tableHTML = N'<H1>Work Order Report</H1>' + N'<table border="1">' + N'<tr><th>Work Order ID</th><th>Product ID</th>' + N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' + N'<th>Expected Revenue</th></tr>' + CAST ( ( SELECT td = wo.WorkOrderID, '', td = p.ProductID, '', td = p.Name, '', td = wo.OrderQty, '', td = wo.DueDate, '', td = (p.ListPrice - p.StandardCost) * wo.OrderQty FROM AdventureWorks.Production.WorkOrder as wo JOIN AdventureWorks.Production.Product AS p ON wo.ProductID = p.ProductID WHERE DueDate > '2004-04-30' AND DATEDIFF(dd, '2004-04-30', DueDate) < 2 ORDER BY DueDate ASC, (p.ListPrice - p.StandardCost) * wo.OrderQty DESC FOR XML PATH('tr'), TYPE ) AS NVARCHAR(MAX) ) + N'</table>' ; EXEC msdb.dbo.sp_send_dbmail @recipients='[email protected]', @subject = 'Work Order List', @body = @tableHTML, @body_format = 'HTML' ;

Отличный код, согласны? Редактирование и изменение этого кода доставит нам анальные неудобства.

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

Перейдя в связь , вы своими глазами увидите, насколько большими могут быть шаблоны html-писем.

А редактирование чего-либо подобного потратит массу вашего времени и усилий.

А если бы вы использовали трехуровневую архитектуру, вам не пришлось бы использовать такие изощренные методы проектирования букв.

Можно использовать любой фреймворк с шаблонизатором, и на этом все закончится.



Сложный функционал

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

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

Конечно, вы можете сказать так:

Пока нет необходимости в таком функционале, нет необходимости использовать дополнительный уровень.

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

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

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

  • Изменилось имя поля в таблице — вам просто нужно будет описать в модели, что это свойство теперь относится к другому полю, и вам не нужно будет менять логику приложения и все места, где это поле используется.

  • Вам нужно использовать данные из другой СУБД — просто сделайте запрос к другой базе и спокойно работайте с этими данными.

  • Вам нужно обратиться к стороннему сервису и получить оттуда данные, прежде чем делать, например, INSERT — нет проблем, это очень легко сделать в любом фреймворке.

  • Нужна асинхронность при выполнении запросов — берём тот же NodeJS с его хвалёной асинхронностью и готово.

  • Вам нужно сменить базу данных — вам не придется переписывать все хранимые процедуры для новой базы данных, вы просто меняете драйвер базы данных и забываете об этом.

И таких примеров тысячи, если не десятки тысяч.

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

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

Теперь современные фреймворки будут писать за вас все SQL-запросы.

И они не пропустят точку с запятой.

От вас требуется грамотно использовать все инструменты, которые предоставляет фреймворк, а не изобретать велосипеды.

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

UPD 13.02.2018 Спасибо спешурический позади аргументированный комментарий к этой статье Теги: #базы данных #архитектура приложений #проектирование приложений #Системный анализ и проектирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.