Посилальна цілісність (англ. referential integrity) — один з різновидів обмеження узгодженості бази даних, який полягає у відсутності в будь-якому з її відношень посилань на дані, що відсутні в іншому відношенні.
Визначення
Зв'язки між даними, що зберігаються в різних відношеннях, у реляційній базі даних встановлюються за допомогою використання зовнішніх ключів — для встановлення зв'язку між кортежем відношення A з визначеним кортежем відношення B до передбачених для цього атрибутів кортежу відношення A записується значення первинного ключа (а в загальному випадку значення потенційного ключа) цільового кортежу відношення B. Таким чином, завжди є можливість виконати дві операції:
- визначити, з яким кортежем відношення B зв'язано визначений кортеж відношення A;
- знайти всі кортежі відношення A, що мають зв'язки з визначеним кортежем відношення B.
Завдяки наявності зв'язків у реляційній базі даних можна зберігати факти без надлишкового дублювання, тобто у нормалізованому вигляді. Посилальну цілісність може бути проілюстровано наступним чином:
- Дано два відношення A і B, зв'язані зовнішнім ключем. Первинний ключ відношення B — атрибут
B.key
. Зовнішній ключ відношення A, що посилається на B — атрибутA.b
. Посилальна цілісність для цих відношень A і B має місце тоді, коли виконується умова: для кожного кортежу відношення A існує відповідний кортеж відношення B, тобто кортеж, у якогоB.key = A.b
.
База даних має властивість посилальної цілісності, коли для довільної пари зв'язаних зовнішнім ключем відношень у ній умова посилальної цілісності виконується.
Якщо вищенаведена умова не виконується, то кажуть, що в базі даних порушено посилальну цілісність. Така база даних не може нормально експлуатуватися, оскільки в ній розірвані логічні зв'язки між залежними один від одного фактами. Безпосереднім результатом порушення посилальної цілісності є те, що коректним запитом не завжди вдається отримати коректний результат.
Приклад
Розгляньмо деяку базу даних, що складається з таких двох таблиць:
|
|
Так, у цьому прикладі реляційна база даних, що складається з таблиць Address і Street, забезпечує зберігання адрес. При цьому основна таблиця Address містить безпосередньо номер будинку та квартири, а замість назви вулиці у поле Street має зовнішній ключ, який посилається на таблицю Street — довідник вулиць. Очевидно, що повноцінну адресу має бути представлено двома зв'язаними записами в обох названих таблицях, що технічно висловлюється в умові: для будь-якого запису таблиці Address в таблиці Street повинен існувати відповідний запис, тобто запис із Street.Key = Address.Street. Щоб отримати список повних адрес із таблиць такої структури, коли в них виконується посилальна цілісність, достатньо застосувати до даних таблиць SQL-запит
select * from Address, Street where Address.Street = Street.Key
В даному прикладі, однак, посилальну цілісність порушено. Два записи таблиці Address (Key = 887
і Key = 994
) мають у полі Street так звані «висячі» посилання — значення, яким не відповідають записи в таблиці Street (ці посилання показано червоним кольором). Через це результат вищенаведеного запиту не міститиме цих двох записів — для них умова запиту не виконається. І ще один запис не буде вибрано вищенаведеним запитом — запис таблиці Address з Key = 85
. Це варіант навмисного (та, в деяких випадках, легального) порушення посилальної цілісності — в полі зовнішнього ключа записано NULL (показано блакитним кольором). Аби отримати список усіх адрес, навіть тих, в яких не вказано вулицю, необхідно використати відкрите з'єднання, яке в одному з варіантів синтаксису записується так:
select * from Address left outer join Street on Address.Street = Street.Key
Якщо ж вимагається отримати список, до якого не входять записи з «висячими» посиланнями, то доведеться ускладнити запит:
select * from Address left outer join Street on (Address.Street = Street.Key) or (Address.Street is null)
Підтримування посилальної цілісності в БД
Причини порушень
Правильно спроектована та підтримувана база даних не дає можливості порушення посилальної цілісності. Тим не менше, такі порушення можуть з'явитися протягом експлуатації бази через цілий ряд причин. Деякі з них:
- Некоректна робота прикладного програмного забезпечення
- Зрозуміло, що в разі помилки у програмі, що виконує модифікацію бази даних, базу може бути модифіковано неприпустимим чином, внаслідок чого утворюються «висячі» посилання. Програма може припускатися помилок наступних видів:
- Неповний запис об'єктів
- Дані об'єкта розміщуються в записах декількох таблиць, а програма не записує котрусь із них.
- Некоректне редагування посилання
- Значення зовнішнього ключа змінюється на таке, якому не відповідає жоден запис у зв'язаній таблиці.
- Редагування первинного ключа без каскадного оновлення
- У таблиці, на яку є посилання, редагується первинний ключ, але при цьому зовнішні ключі у зв'язаних із нею таблицях лишаються без змін.
- Вилучення запису без каскадного оновлення
- З таблиці вилучається запис, на який наявні посилання за зовнішніми ключами інших таблиць, при цьому у зв'язаних записах зовнішні ключі не змінюються. Внаслідок чого всі записи інших таблиць, які посилаються на нього, стають некоректними.
- Збої в роботі системного програмного забезпечення та обладнання
- Навіть коли прикладне програмне забезпечення працює абсолютно правильно, можливе порушення посилальної цілісності. Наприклад, якщо при додаванні об'єкта до бази потрібно додати декілька зв'язаних записів у декілька таблиць, то очевидно, що посилальну цілісність буде порушено протягом додавання даних (коли частину зв'язаних записів уже додано, а частину — ще ні), і відновиться вона лише після завершення операції. Якщо під час виконання операції її буде перервано (через переповнення диску, збою живлення, чи через будь-які інші причини), то частину записів буде додано до бази даних, а частину — ні. Частина доданих записів залишиться з некоректними посиланнями.
Порожні зовнішні ключі
Можлива ситуація, коли зовнішній ключ замість посилання на наявний запис у таблиці бази даних містить «відсутнє значення» NULL. Такий стан можна тлумачити як відсутність деякої частини об'єкта. Хоча з точки зору чистої теорії це недопустимо, на практиці іноді буває зручно дозволити використання порожніх зовнішніх ключів. Аби коректно працювати з групами зв'язаних таблиць, які дозволяють порожні зовнішні ключі, використовуються специфічна операція мови SQL — відкрите, або зовнішнє з'єднання (англ. outer join).
Посилальна цілісність на тригерах
Можливе підтримування посилальної цілісності бази даних з використанням механізму тригерів. У цьому разі для будь-якої потенційно небезпечної операції над таблицею створюється тригер, який виконує необхідні перевірки чи навіть змінює дані у зв'язаних таблицях, аби виключити втрату посилань.
Так, для забезпечення каскадних змін тригер може бути встановлено на операцію зміни запису в таблиці. Якщо виявиться, що під час редагування змінилося значення ключового поля, то тригер повинен виконати узгоджені зміни в усіх таблицях, зв'язаних із даною, замінивши старе значення зовнішніх ключів новим.
Для виключення втрати посилань від некоректного редагування зовнішнього ключа тригер повинен при кожній зміні відповідного поля перевіряти, чи наявний у зв'язаній таблиці запис із таким первинним ключем.
Для захисту від вилучення запису, на який наявні посилання, тригер на зв'язаній таблиці повинен у разі вилучення перевіряти наявність посилань і, залежно від необхідності, або забороняти вилучення, або обнуляти зовнішні ключі тим чи іншим чином.
Посилальна цілісність на зовнішніх ключах
СКБД може мати механізм автоматичного підтримування посилальної цілісності, заснований на явному описі посилань під час створення бази даних. Під час опису таблиць бази даних програміст явно описує, які поля таблиць є зовнішніми ключами і на які таблиці вони посилаються. Ця інформація зберігається у службових ділянках пам'яті бази даних. Будь-яка операція, що змінює дані у таблиці, викликає автоматичну перевірку посилальної цілісності. При цьому:
- У разі операції додавання чи редагування запису автоматично перевіряється, чи посилаються зовнішні ключі у цьому записі на наявні записи в оголошених під час опису зв'язаних таблицях. Якщо з'ясовується, що операція спричинить появу некоректних посилань, то вона не виконується, і система повертає помилку.
- У разі операції редагування запису перевіряється:
- якщо змінюється її первинний ключ і на даний запис наявні посилання, то операція редагування завершується з помилкою;
- якщо змінюється якийсь із зовнішніх ключів, які зберігаються у цьому записі, і після зміни зовнішній ключ посилатиметься на відсутній запис, то операція редагування завершується з помилкою.
- У разі операції вилучення запису перевіряється, чи немає на нього посилань. Якщо посилання наявні, то можливі три варіанти подальших дій (та, що фактично виконається, залежить від системи керування базами даних і від вибору програміста, який він повинен зробити під час опису зв'язку):
- Заборона — вилучення блокується та повертається помилка.
- Каскадне вилучення — в межах однієї транзакції відбувається вилучення даного запису та всіх записів, які посилаються на даний. Якщо на записи, що вилучаються, також є посилання і налаштування також вимагають вилучення, то каскадне вилучення продовжується далі. Таким чином, після вилучення даного запису в базі не лишається жодного запису, який прямо чи опосередковано посилається на нього. Якщо хоча б один із записів, який посилається на нього, вилучити не вдається (або для нього налаштовано заборону, або відбувається будь-яка інша помилка), то всі вилучення забороняються.
- Присвоєння NULL — в усі зовнішні ключі записів, які посилаються на даний, записується маркер NULL. Якщо хоча б для одного з записів, які посилаються на нього, це неможливо (наприклад, якщо поле зовнішнього ключа описано як NOT NULL), то вилучення забороняється.
Ця стаття може містити . (лютий 2017) |
Ця стаття не містить . (березень 2017) |
Це незавершена стаття про бази даних. Ви можете проєкту, виправивши або дописавши її. |
Література
Зноски
- Silberschatz та Sudarshan, 2011, с. 11.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Posilalna cilisnist angl referential integrity odin z riznovidiv obmezhennya uzgodzhenosti bazi danih yakij polyagaye u vidsutnosti v bud yakomu z yiyi vidnoshen posilan na dani sho vidsutni v inshomu vidnoshenni Priklad bazi danih u yakoyi nemaye posilalnoyi cilisnosti V comu prikladi isnuye znachennya zovnishnogo klyucha vikonavcya id u tablici albomiv yake posilayetsya na vidsutnogo vikonavcya Tobto nayavne znachennya zovnishnogo klyucha yake ne maye vidpovidnogo pervinnogo klyucha u vidpovidnij tablici Tak stalos tomu sho vikonavec Bez Obmezhen zi znachennyam vikonavcya id rivnim 4 chomus buv vidalenij z tablici vikonavciv Prote albom posilayetsya na cogo vikonavcya Z posilalnoyu cilisnistyu ce bulo b nemozhlivo ViznachennyaZv yazki mizh danimi sho zberigayutsya v riznih vidnoshennyah u relyacijnij bazi danih vstanovlyuyutsya za dopomogoyu vikoristannya zovnishnih klyuchiv dlya vstanovlennya zv yazku mizh kortezhem vidnoshennya A z viznachenim kortezhem vidnoshennya B do peredbachenih dlya cogo atributiv kortezhu vidnoshennya A zapisuyetsya znachennya pervinnogo klyucha a v zagalnomu vipadku znachennya potencijnogo klyucha cilovogo kortezhu vidnoshennya B Takim chinom zavzhdi ye mozhlivist vikonati dvi operaciyi viznachiti z yakim kortezhem vidnoshennya B zv yazano viznachenij kortezh vidnoshennya A znajti vsi kortezhi vidnoshennya A sho mayut zv yazki z viznachenim kortezhem vidnoshennya B Zavdyaki nayavnosti zv yazkiv u relyacijnij bazi danih mozhna zberigati fakti bez nadlishkovogo dublyuvannya tobto u normalizovanomu viglyadi Posilalnu cilisnist mozhe buti proilyustrovano nastupnim chinom Dano dva vidnoshennya A i B zv yazani zovnishnim klyuchem Pervinnij klyuch vidnoshennya B atribut B key Zovnishnij klyuch vidnoshennya A sho posilayetsya na B atribut A b Posilalna cilisnist dlya cih vidnoshen A i B maye misce todi koli vikonuyetsya umova dlya kozhnogo kortezhu vidnoshennya A isnuye vidpovidnij kortezh vidnoshennya B tobto kortezh u yakogo B key A b Baza danih maye vlastivist posilalnoyi cilisnosti koli dlya dovilnoyi pari zv yazanih zovnishnim klyuchem vidnoshen u nij umova posilalnoyi cilisnosti vikonuyetsya Yaksho vishenavedena umova ne vikonuyetsya to kazhut sho v bazi danih porusheno posilalnu cilisnist Taka baza danih ne mozhe normalno ekspluatuvatisya oskilki v nij rozirvani logichni zv yazki mizh zalezhnimi odin vid odnogo faktami Bezposerednim rezultatom porushennya posilalnoyi cilisnosti ye te sho korektnim zapitom ne zavzhdi vdayetsya otrimati korektnij rezultat PrikladRozglyanmo deyaku bazu danih sho skladayetsya z takih dvoh tablic Address Adresa Key House Apart Street12 52 1 1515 12 a 2 1585 9 3 NULL152 3 4 120254 85 b 5 122374 132 6 150495 2 7 35514 52 8 15632 75 9 130887 56 10 155994 47 11 121021 32 12 844511 14 13 150 Street Vulicya Key Prefix Name15 vul Harkivska35 vul Stepana Banderi84 vul Stefana Banaha120 vul Petra Grigorenka122 vul Naukova130 pr Geroyiv Nebesnoyi Sotni150 pr Shevchenka Tak u comu prikladi relyacijna baza danih sho skladayetsya z tablic Address i Street zabezpechuye zberigannya adres Pri comu osnovna tablicya Address mistit bezposeredno nomer budinku ta kvartiri a zamist nazvi vulici u pole Street maye zovnishnij klyuch yakij posilayetsya na tablicyu Street dovidnik vulic Ochevidno sho povnocinnu adresu maye buti predstavleno dvoma zv yazanimi zapisami v oboh nazvanih tablicyah sho tehnichno vislovlyuyetsya v umovi dlya bud yakogo zapisu tablici Address v tablici Street povinen isnuvati vidpovidnij zapis tobto zapis iz Street Key Address Street Shob otrimati spisok povnih adres iz tablic takoyi strukturi koli v nih vikonuyetsya posilalna cilisnist dostatno zastosuvati do danih tablic SQL zapit select from Address Street where Address Street Street Key V danomu prikladi odnak posilalnu cilisnist porusheno Dva zapisi tablici Address Key 887 i Key 994 mayut u poli Street tak zvani visyachi posilannya znachennya yakim ne vidpovidayut zapisi v tablici Street ci posilannya pokazano chervonim kolorom Cherez ce rezultat vishenavedenogo zapitu ne mistitime cih dvoh zapisiv dlya nih umova zapitu ne vikonayetsya I she odin zapis ne bude vibrano vishenavedenim zapitom zapis tablici Address z Key 85 Ce variant navmisnogo ta v deyakih vipadkah legalnogo porushennya posilalnoyi cilisnosti v poli zovnishnogo klyucha zapisano NULL pokazano blakitnim kolorom Abi otrimati spisok usih adres navit tih v yakih ne vkazano vulicyu neobhidno vikoristati vidkrite z yednannya yake v odnomu z variantiv sintaksisu zapisuyetsya tak select from Address left outer join Street on Address Street Street Key Yaksho zh vimagayetsya otrimati spisok do yakogo ne vhodyat zapisi z visyachimi posilannyami to dovedetsya uskladniti zapit select from Address left outer join Street on Address Street Street Key or Address Street is null Pidtrimuvannya posilalnoyi cilisnosti v BDPrichini porushen Pravilno sproektovana ta pidtrimuvana baza danih ne daye mozhlivosti porushennya posilalnoyi cilisnosti Tim ne menshe taki porushennya mozhut z yavitisya protyagom ekspluataciyi bazi cherez cilij ryad prichin Deyaki z nih Nekorektna robota prikladnogo programnogo zabezpechennya Zrozumilo sho v razi pomilki u programi sho vikonuye modifikaciyu bazi danih bazu mozhe buti modifikovano nepripustimim chinom vnaslidok chogo utvoryuyutsya visyachi posilannya Programa mozhe pripuskatisya pomilok nastupnih vidiv Nepovnij zapis ob yektiv Dani ob yekta rozmishuyutsya v zapisah dekilkoh tablic a programa ne zapisuye kotrus iz nih Nekorektne redaguvannya posilannya Znachennya zovnishnogo klyucha zminyuyetsya na take yakomu ne vidpovidaye zhoden zapis u zv yazanij tablici Redaguvannya pervinnogo klyucha bez kaskadnogo onovlennya U tablici na yaku ye posilannya redaguyetsya pervinnij klyuch ale pri comu zovnishni klyuchi u zv yazanih iz neyu tablicyah lishayutsya bez zmin Viluchennya zapisu bez kaskadnogo onovlennya Z tablici viluchayetsya zapis na yakij nayavni posilannya za zovnishnimi klyuchami inshih tablic pri comu u zv yazanih zapisah zovnishni klyuchi ne zminyuyutsya Vnaslidok chogo vsi zapisi inshih tablic yaki posilayutsya na nogo stayut nekorektnimi Zboyi v roboti sistemnogo programnogo zabezpechennya ta obladnannya Navit koli prikladne programne zabezpechennya pracyuye absolyutno pravilno mozhlive porushennya posilalnoyi cilisnosti Napriklad yaksho pri dodavanni ob yekta do bazi potribno dodati dekilka zv yazanih zapisiv u dekilka tablic to ochevidno sho posilalnu cilisnist bude porusheno protyagom dodavannya danih koli chastinu zv yazanih zapisiv uzhe dodano a chastinu she ni i vidnovitsya vona lishe pislya zavershennya operaciyi Yaksho pid chas vikonannya operaciyi yiyi bude perervano cherez perepovnennya disku zboyu zhivlennya chi cherez bud yaki inshi prichini to chastinu zapisiv bude dodano do bazi danih a chastinu ni Chastina dodanih zapisiv zalishitsya z nekorektnimi posilannyami Porozhni zovnishni klyuchi Mozhliva situaciya koli zovnishnij klyuch zamist posilannya na nayavnij zapis u tablici bazi danih mistit vidsutnye znachennya NULL Takij stan mozhna tlumachiti yak vidsutnist deyakoyi chastini ob yekta Hocha z tochki zoru chistoyi teoriyi ce nedopustimo na praktici inodi buvaye zruchno dozvoliti vikoristannya porozhnih zovnishnih klyuchiv Abi korektno pracyuvati z grupami zv yazanih tablic yaki dozvolyayut porozhni zovnishni klyuchi vikoristovuyutsya specifichna operaciya movi SQL vidkrite abo zovnishnye z yednannya angl outer join Posilalna cilisnist na trigerah Mozhlive pidtrimuvannya posilalnoyi cilisnosti bazi danih z vikoristannyam mehanizmu trigeriv U comu razi dlya bud yakoyi potencijno nebezpechnoyi operaciyi nad tabliceyu stvoryuyetsya triger yakij vikonuye neobhidni perevirki chi navit zminyuye dani u zv yazanih tablicyah abi viklyuchiti vtratu posilan Tak dlya zabezpechennya kaskadnih zmin triger mozhe buti vstanovleno na operaciyu zmini zapisu v tablici Yaksho viyavitsya sho pid chas redaguvannya zminilosya znachennya klyuchovogo polya to triger povinen vikonati uzgodzheni zmini v usih tablicyah zv yazanih iz danoyu zaminivshi stare znachennya zovnishnih klyuchiv novim Dlya viklyuchennya vtrati posilan vid nekorektnogo redaguvannya zovnishnogo klyucha triger povinen pri kozhnij zmini vidpovidnogo polya pereviryati chi nayavnij u zv yazanij tablici zapis iz takim pervinnim klyuchem Dlya zahistu vid viluchennya zapisu na yakij nayavni posilannya triger na zv yazanij tablici povinen u razi viluchennya pereviryati nayavnist posilan i zalezhno vid neobhidnosti abo zaboronyati viluchennya abo obnulyati zovnishni klyuchi tim chi inshim chinom Posilalna cilisnist na zovnishnih klyuchah SKBD mozhe mati mehanizm avtomatichnogo pidtrimuvannya posilalnoyi cilisnosti zasnovanij na yavnomu opisi posilan pid chas stvorennya bazi danih Pid chas opisu tablic bazi danih programist yavno opisuye yaki polya tablic ye zovnishnimi klyuchami i na yaki tablici voni posilayutsya Cya informaciya zberigayetsya u sluzhbovih dilyankah pam yati bazi danih Bud yaka operaciya sho zminyuye dani u tablici viklikaye avtomatichnu perevirku posilalnoyi cilisnosti Pri comu U razi operaciyi dodavannya chi redaguvannya zapisu avtomatichno pereviryayetsya chi posilayutsya zovnishni klyuchi u comu zapisi na nayavni zapisi v ogoloshenih pid chas opisu zv yazanih tablicyah Yaksho z yasovuyetsya sho operaciya sprichinit poyavu nekorektnih posilan to vona ne vikonuyetsya i sistema povertaye pomilku U razi operaciyi redaguvannya zapisu pereviryayetsya yaksho zminyuyetsya yiyi pervinnij klyuch i na danij zapis nayavni posilannya to operaciya redaguvannya zavershuyetsya z pomilkoyu yaksho zminyuyetsya yakijs iz zovnishnih klyuchiv yaki zberigayutsya u comu zapisi i pislya zmini zovnishnij klyuch posilatimetsya na vidsutnij zapis to operaciya redaguvannya zavershuyetsya z pomilkoyu U razi operaciyi viluchennya zapisu pereviryayetsya chi nemaye na nogo posilan Yaksho posilannya nayavni to mozhlivi tri varianti podalshih dij ta sho faktichno vikonayetsya zalezhit vid sistemi keruvannya bazami danih i vid viboru programista yakij vin povinen zrobiti pid chas opisu zv yazku Zaborona viluchennya blokuyetsya ta povertayetsya pomilka Kaskadne viluchennya v mezhah odniyeyi tranzakciyi vidbuvayetsya viluchennya danogo zapisu ta vsih zapisiv yaki posilayutsya na danij Yaksho na zapisi sho viluchayutsya takozh ye posilannya i nalashtuvannya takozh vimagayut viluchennya to kaskadne viluchennya prodovzhuyetsya dali Takim chinom pislya viluchennya danogo zapisu v bazi ne lishayetsya zhodnogo zapisu yakij pryamo chi oposeredkovano posilayetsya na nogo Yaksho hocha b odin iz zapisiv yakij posilayetsya na nogo viluchiti ne vdayetsya abo dlya nogo nalashtovano zaboronu abo vidbuvayetsya bud yaka insha pomilka to vsi viluchennya zaboronyayutsya Prisvoyennya NULL v usi zovnishni klyuchi zapisiv yaki posilayutsya na danij zapisuyetsya marker NULL Yaksho hocha b dlya odnogo z zapisiv yaki posilayutsya na nogo ce nemozhlivo napriklad yaksho pole zovnishnogo klyucha opisano yak NOT NULL to viluchennya zaboronyayetsya Cya stattya mozhe mistiti originalne doslidzhennya Bud laska udoskonalte yiyi perevirivshi sumnivni tverdzhennya j dodavshi posilannya na dzherela Tverdzhennya yaki mistyat lishe originalne doslidzhennya mayut buti vilucheni lyutij 2017 Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno berezen 2017 Ce nezavershena stattya pro bazi danih Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi LiteraturaSilberschatz Abraham Sudarshan S 2011 Database system concepts vid 6 New York McGraw Hill ISBN 9780073523323 OCLC 436031093 ZnoskiSilberschatz ta Sudarshan 2011 s 11