Головна Інформатика
Бази даних: проектування
|
|
||||||||||||||||||||||||||||||||||
Обмеження посилальної цілісності в батьківській таблиціПрипустимо, що але таблицями, асоційованим з сутностями "Замовлення" і "Товари замовлення", є деякі раніше сформовані відомості, які дозволяють побачити можливі дії і можливі проблеми, що виникають при додаванні, видаленні і змінюються дані в батьківській таблиці "Замовлення" (рис. 5.43).
Першим розглянутим дією є додавання нового замовлення. Оскільки замовлення не визначають товари, які повинні бути в них, то ця дія не спричинить за собою ніяких проблемних ситуацій щодо товарів, які в ньому згодом будуть. Але, припустимо, що електронний магазин при створенні нового замовлення автоматично вносить в замовлення якусь подарункову позицію товару. Тоді виходить, що не може існувати замовлень без товарів, а це значить, то в дочірню таблицю теж потрібно додати новий запис. Ця дія не передбачено стандартними механізмами обмеження посилальної цілісності і відноситься до операцій, що визначаються в предметної області. Тому для реалізації такого умови роботи з замовленнями розробнику необхідно самостійно визначити тригерній дію, яке виконає додавання в замовлення потрібної позиції товару. Друга дія, що виконується над батьківської таблицею, полягає в зміні значення первинного ключа (рис. 5.44). В принципі, такі операції часто забороняються в СУБД, і будь-яка спроба змінити значення первинного ключа натикається на її опір, що полягає в блокуванні дії. Проте, часто ця операція допустима і її виконання може привести до проблем в дочірній таблиці. Припустимо, що змінили значення первинного ключа замовлення з "2" на "4". З огляду на, що в дочірній таблиці на замовлення зі значенням ключа "2" є позиція товару, то безконтрольне зміна призведе до втрати цієї позиції товару в замовлення, що неприпустимо.
Мал. 5.44. Зміна значення первинного ключа
Вирішення цієї ситуації може виконуватися різними варіантами: першим, найбільш коректним, є вказівка дії "Cascade", оскільки тоді значення зовнішнього ключа в дочірній таблиці по зв'язаних записів автоматично буде змінено на правильне значення і порушення цілісності не буде,
Таким чином, для розглянутого прикладу можливі два прийнятні варіанти обмеження посилальної цілісності: заборонити зміну значень первинного ключа дією "Restrict" або дозволити зміну з подальшим автоматичним зміною значення в зовнішньому ключі дочірньої таблиці через дію "Cascade". Третім дією є видалення запису в батьківській таблиці, що в розглянутому прикладі означає видалення замовлення (рис. 5.45). В СУБД дана дія не має однозначного варіанту розв'язання проблеми, крім випадку, якщо в дочірній таблиці немає пов'язаних записів. При такій ситуації, коли замовлення не містить замовлених товарів, видалення замовлення не викличе порушення цілісності та виконання дії нічого не перешкоджає.
Якщо припустити, як в розглянутому прикладі даних, що видаляється замовлення містить замовлені товари, то його видалення призведе до порушення цілісності, яке полягає в збереженні замовлених товарів, закріплених за неіснуючим замовленням. Его неприпустимо і має бути дозволено дії обмеження посилальної цілісності, які можуть бути представлені такими варіантами:
Таким чином, з огляду на, що товари не можуть зберігатися в таблиці бази даних "Товари замовлення" без вказівки замовлення, за яким вони закріплені, допустимими варіантами можуть бути "Restrict" і "Cascade". При розгляді можливості видалення замовлення разом із замовленням, що але предметної області допустимо, варіант дії "Cascade" є найбільш коректним і правильним. |
<< | ЗМІСТ | >> |
---|