Розширюваність за допомогою рівня абстракції даних

18 -J уществует досить поширена ситуація: схема бази даних проектувалася багато років або навіть десятиліть тому, і незважаючи на те, що все в організації хочуть поліпшити її структуру, це настільки ризиковано і тягне за собою такі витрати, що ніхто за це не береться А причина одна – існує занадто багато безпосередніх підключень до таблиць даних Найбільші витрати тягне за собою не створення, а підтримка програмного забезпечення Що ж до баз даних, то прямі підключення в динамічних запитах SQL до таблиць підтримувати найважче Як в принципі доміно: будь-яка зміна в схемі відбивається на збої в програмах, звітах і пакетах DTS Звичайна інструкція SELECT практично бере в заручники базу даних, і будь-яка надія на розширення розсіюється, як дим Головне достоїнство SQL-простота створення запитів до даних – стає його слабкою ланкою Відповідь лежить в рівнях абстракції

Рівні абстракції оточують нас всюди Будь інтерфейс користувача, що приховує за своєю простотою всю складність обробки даних, являє собою рівень абстракції Хорошим прикладом рівня абстракції, з яким нам доводиться стикатися щодня, є стандартні елементи керування автомобілем Звичний кермо дозволяє нам керувати машиною, не замислюючись про те, як він зєднаний з передніми колесами Педаль гальма дозволяє уповільнити рух автомобіля, абсолютно не вдаючись у тонкощі функціонування гальмівної системи Те ж можна сказати і про педалі газу, важелі перемикання передач, фарах і тд Звичні елементи управління є рівнем абстракції механічної роботи автомобіля

Щоб уникнути створення крихкою бази даних або виправити вже існуючу, слід використовувати рівень абстракції – єдину точку доступу до даних, що служить ло-

гическим буфером обміну Це своєрідний метод приховування даних, коли доступ до бази здійснюється за допомогою якогось проміжної ланки База даних або серверний програмний код може з часом змінитися, в той же час доступ до даних залишиться постійним Грамотно спроектований рівень абстракції даних і гнучка схема бази – ось два ключа для створення розширюваної бази даних

Принципи інформаційної архітектури, сформульовані у розділі 1 Підтримують концепцію рівнів абстракції даних Головний принцип свідчить, що дані повинні бути доступні як зараз, так і в майбутньому Якщо база даних повинна вижити в майбутньому (а багато бази набагато переживають свої вихідні інтерфейси користувача), вона повинна бути розширюваною А кращий спосіб гарантувати розширюваність – це використовувати рівень абстракції даних

Знавці вже стомилися доводити, що архітектури клієнт / сервер і багаторівнева не справляються з роботою і що єдина відповідь лежить у використанні архітектури, орієнтованої на служби (SOA) Мені здається, що це не зовсім так Бази даних, створені без використання рівня абстракції даних, можуть дійсно не працювати, як потрібно У той же час при використанні рівня абстракції даних будуть відмінно працювати всі види архітектур: і багаторівнева, і клієнт / сервер, і SO А

Рівень абстракції даних може існувати як в базі даних (у вигляді збережених процедур, уявлень і функцій), так і в додатку (за допомогою використання NET і ADO) У той же час не змішуйте ці два підходи

Особисто я віддаю перевагу створювати рівень абстракції в базі даних, і на це є дві причини По-перше, це дозволяє розташувати програмний код перевірки і всі класифікатори настільки близько до даних, наскільки це можливо По-друге, це гарантує, що ніякої сторонній код не омине рівень абстракції і не отримає прямий доступ до даних Розумію, що деякі не згодні з цією точкою зору, і в цьому немає нічого поганого – головне, щоб рівень абстракції існував

В цілому рівню абстракції даних потрібен окремий інтерфейс для кожної з таких завдань:

■ вставка даних

■ оновлення даних

Ш видалення даних

■ відбір окремого рядка і перерахування всіх користувальницьких обєктів

При проектуванні рівня абстракції даних уникайте матричного підходу функцій CRUD (абревіатура від операцій створення, вилучення, оновлення та видалення обєктів) для кожної таблиці У цьому випадку рівень абстракції даних буде жорстко привязаний до схеми Плануйте цей рівень як набір логічних угод, що взаємодіють з цільовими сутностями і завданнями, навіть якщо така угода включає безліч таблиць Наприклад, можна створити єдиний інтерфейс, який взаємодіє з таблицями складських запасів, замовлень і відвантаження

У цьому розділі ми розглянемо ряд збережених процедур з рівня абстракції даних навчальної бази OBXKites

Збережена процедура AddNew

Збережена процедура AddNew відповідає за вставку в базу даних нових рядків Головним завданням цієї процедури є перевірка допустимості даних, перетворення кодів під

зовнішні ключі та виконання інструкції INSERT Процедура AddNew також здатна вирішувати питання очікування блокування Нижче наведено повний код збереженої процедури AddNew з бази даних OBXKites

CREATE PROCEDURE pProduct_AddNew(

@ProductCategoryName NVARCHAR(50),

©Code CHAR(10),

@Name NVARCHAR(50),

@ProductDescription NVARCHAR(100) = NULL )

AS

SET NOCOUNT ON DECLARE

@ProductCategoryID UNIQUEIDENTIFIER SELECT @ProductCategoryID = ProductCategorylD FROM dboProductCategory

WHERE ProductCategoryName = @ProductCategoryName IF @@Error &lt&gt 0 RETURN -100 IF ©ProductCategorylD IS NULL BEGIN

RAISERROR (Категорія товарів:’% s! не знайдено ,

15,1,@ProductCategoryName)

RETURN -100 END BEGIN TRY

INSERT dboProduct (ProductCategorylD, Code, ProductName, ProductDescription)

VALUES (©ProductCategorylD, @Code, @Name,

©ProductDescription )

END TRY BEGIN CATCH

RAISERROR (Неможливо вставити новий товар, 15,1)

RETURN -10 0 END CATCH

Для тестування процедури спробуємо вставити в таблицю Product товар з кодом 999:

Ехес pProduct_AddNew

@ ProductCategoryName = ОВХ,

@Code = 999,

@Name = Test Kit,

©ProductDescription

= official kite testing kit for contests’

Переконаємося, що вставка виконана за допомогою наступного запиту на відбір товару з кодом 999:

SELECT ProductName, ProductCategoryName FROM dboProduct

JOIN ProductCategory

ON ProductProductCategorylD

= ProductCategory ProductCategorylD WHERE Code = 999

Отримаємо очікуваний результат:

Name            ProductCategoryName

Test Kit        OBX

Збережена процедура Fetch

Збережена процедура Fetch витягає дані Якщо ускладнити її, то можна приймати безліч параметрів, повертаючи, залежно від їх складу, один рядок, їх відфільтрований набір або все безліч рядків При цьому абсолютно не потрібно писати для кожного конкретного набору даних окрему процедуру У реченні WHERE використовується значення за замовчуванням, null, так що якщо який-небудь параметр не надано, відповідний критерій відключається

Дана процедура, що зберігається також вирішує питання очікування блокування і взаімоблокіровок, використовуючи методи, які ми розглянемо в главі 51 Наступна збережена процедура Fetch повертає інформацію про товар з бази даних OBXKites:

CREATE PROCEDURE pProduct_Fetch(

(©ProductCode CHAR (15) = NULL,

(©Productcategory CHAR (15) = NULL )

AS

SET NoCount ON

SELECT Code, ProductName, ProductDescription, ActiveDate, DiscontinueDate, ProductCategoryName, [RowVersion]

— ProductCreated, ProductModified FROM dboProduct

JOIN dboProductcategory

ON ProductProductCategorylD

= ProductcategoryProductCategorylD WHERE ( Product Code = (©ProductCode OR (©ProductCode IS NULL )

AND ( ProductcategoryProductCategoryName = (©Productcategory OR (©Productcategory IS NULL )

IF (©(©Error &lt&gt 0 RETURN -10 0 RETURN

Викличемо цю процедуру без жодних параметрів і отримаємо дані про всі товари:

Ехес pProduct_Fetch

Представлені нижче результати виконання цієї процедури усічені по стовпцях і рядках

Code Name                       Modified

1001&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Basic Box Kite 21 inch     2002-02-18 09:48:31700

1002&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Dragon Flight 2002-02-18 15:19:34350

1003&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Sky Dancer    2002-02-18 09:48:31700

Якщо підставити параметр (© ProductCode, то збережена процедура Fetch поверне інформацію тільки про один товар (стовпці результату усічені):

Ехес pProduct_Fetch (© ProductCode = 1005

Ось її результат:

Code Name                       Modified

1005 Eagle Wings                2002-02-18 09:48:31700

Установка другого параметра дозволяє отримати список всіх товарів зазначеної категорії (в результаті усічені рядки і стовпці):

EXEC pProduct_Fetch

(©ProductCategory = Book1

Результат такий:

Code Name                       Modified

1036&nbsp Adventures in the OuterBanks 2002-02-25 17:13:15430

1037&nbsp Wright Brothers Kite Designs 2002-02-25 17:13:15430

1038&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp The Lighthouses of the OBX 2002-02-25 17:13:15430

1039&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Outer Banks Map     2002-02-25 17:13:15430

1040&nbsp Kiters Guide to the Outer Banks 2002-02-25 17:13:15430

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*