Сыртқы кілт - Foreign key

Қарапайым тілмен айтқанда, а шетелдік кілт - бұл басқа кестенің бастапқы кілтіне сілтеме жасайтын кестедегі атрибуттар жиынтығы. Шетел кілті осы екі кестені байланыстырады. Оны қоюдың тағы бір тәсілі: контекстінде реляциялық мәліметтер базасы, а шетелдік кілт тәуелділікті шектеудің белгілі бір түріне тәуелді атрибуттардың жиынтығы, атап айтқанда кортеждер шетелдік кілттен тұрады атрибуттар бірінде қатынас, R, тағы бір басқа (міндетті түрде ерекшеленбейтін) қатынаста болуы керек, S, сонымен қатар бұл атрибуттар да болуы керек кандидат кілті С.-да[1][2][3] Қарапайым сөзбен айтқанда, шетелдік кілт - бұл атрибуттардың жиынтығы сілтемелер үміткердің кілті. Мысалы, TEAM деп аталатын кестеде PERSON кестесінде үміткер кілтіне сілтеме жасайтын шетелдік кілт болып табылатын MEMBER_NAME атрибуты болуы мүмкін. MEMBER_NAME сыртқы кілт болғандықтан, TEAM құрамындағы кез-келген мән PERSON кестесінде адамның аты ретінде болуы керек; басқаша айтқанда, Ұжымның әрбір мүшесі - ТҰЛҒА.

Қысқаша мазмұны

Сыртқы кілті бар кесте еншілес кесте деп, ал үміткер кілті бар кесте сілтеме жасалған немесе бас кесте деп аталады.[4] Деректер базасын реляциялық модельдеу мен іске асыруда үміткер кілті дегеніміз - қатынастағы әрбір кортеж (жол) үшін мәндері бірегей болатынына кепілдік беретін нөлдік немесе одан да көп атрибуттардың жиынтығы. Кез-келген кортеж үшін үміткер кілтінің атрибуттарының мәні немесе мәндерінің тіркесімі осы қатынастағы кез-келген кортеж үшін қайталануы мүмкін емес.

Сыртқы кілттің мақсаты сілтеме жасалған кестенің белгілі бір жолын анықтау болғандықтан, әдетте сыртқы кілт негізгі кестенің кейбір қатарындағы үміткер кілтіне тең болуы керек, әйтпесе ешқандай мәні болмайды ( ЖОҚ мәні.[2]). Бұл ереже а деп аталады анықтамалық тұтастықты шектеу екі кестенің арасында.[5]Бұл шектеулерді бұзу дерекқордың көптеген мәселелерінің қайнар көзі болуы мүмкін болғандықтан мәліметтер базасын басқару жүйелері әрбір нөлдік емес шетелдік кілт сілтеме жасалған кестенің қатарына сәйкес келетіндігін қамтамасыз ететін механизмдерді қамтамасыз етеді.[6][7][8]

Мысалы, екі кестесі бар мәліметтер базасын қарастырайық: тұтынушының барлық мәліметтерін қамтитын ТҰТЫП АЛУШЫЛАР кестесі және тапсырыс берушілердің барлық тапсырыстарын қамтитын Тапсырыс кестесі Бизнес әрбір тапсырыс бір тапсырыс берушіге сілтеме жасауды талап етеді делік. Мұны мәліметтер базасында көрсету үшін, бұйрық кестесіне шетелдік кілт бағанасы қосылады (мысалы, CUSTOMERID), ол сілтемелерге сілтеме жасайды бастапқы кілт CUSTOMER (мысалы, жеке куәлік). Кестенің негізгі кілті бірегей болуы керек болғандықтан және CUSTOMERID тек осы кілт өрісінің мәндерін қамтитындықтан, оның мәні болған кезде, CUSTOMERID тапсырыс берген нақты тұтынушыны анықтайды деп ойлауымыз мүмкін. Алайда, бұдан әрі Тапсырыс беруші кестесінің жолдары жойылғанда немесе идентификатор бағанында өзгеріс болған кезде Тапсырыс кестесі жаңартылмаса және бұл кестелермен жұмыс істеу қиындай түссе, бұл бұдан былай қабылданбайды. Көптеген нақты әлемдегі мәліметтер базасы бұл мәселені мастер-кестенің шетелдік кілттерін физикалық түрде жоюдың орнына «инактивациялау» арқылы немесе өзгерту қажет болған кезде сыртқы кілтке барлық сілтемелерді өзгертетін күрделі жаңарту бағдарламалары арқылы жұмыс істейді.

Шетелдік кілттер маңызды рөл атқарады мәліметтер базасын жобалау. Деректер базасын жобалаудың бір маңызды бөлігі - бұл нақты әлем субъектілері арасындағы қатынастардың мәліметтер базасында сілтемелер арқылы көрінуіне, бір кестеден екінші кестеге сілтеме жасау үшін шетелдік кілттерді пайдалану.[9]Деректер базасын жобалаудың тағы бір маңызды бөлігі мәліметтер базасын қалыпқа келтіру, онда кестелер бөлініп, шетелдік кілттер оларды қалпына келтіруге мүмкіндік береді.[10]

Сілтеме (немесе еншілес) кестесіндегі бірнеше жол сілтеме жасалған (немесе ата-аналық) кестенің сол жолына сілтеме жасай алады. Бұл жағдайда екі кесте арасындағы байланыс а деп аталады бірінен көпке дейінгі қатынастар сілтеме кестесі мен сілтеме кестесі арасында.

Сонымен қатар, бала мен ата-ана кестесі, шын мәнінде, бір кесте болуы мүмкін, яғни шетелдік кілт сол кестеге сілтеме жасайды. Мұндай шетелдік кілт белгілі SQL: 2003 ж өзіндік сілтеме немесе рекурсивті шетелдік кілт ретінде. Деректер қорын басқару жүйелерінде бұл көбінесе бірінші және екінші сілтемелерді бір кестеге байланыстыру арқылы жүзеге асырылады.

Кестеде бірнеше шетелдік кілттер болуы мүмкін, ал әрбір шетелдік кілттерде әр түрлі ата-аналар кестесі болуы мүмкін. Әрбір сыртқы кілт тәуелсіз мәліметтер базасы жүйесі. Сондықтан кестелер арасындағы каскадтық қатынастарды шетелдік кілттерді қолдану арқылы орнатуға болады.

Сыртқы кілт басқа қатынастағы мәні негізгі кілтпен сәйкес келетін қатынастың атрибуттары немесе атрибуттар жиынтығы ретінде анықталады. шектеу. Мұндай шектеуді бар кестеге қосу үшін синтаксис анықталды SQL: 2003 ж төменде көрсетілгендей. ӘДЕБИЕТТЕР тармағында бағандар тізімін алып тастау шетелдік кілт сілтеме жасалған кестенің негізгі кілтіне сілтеме жасауды білдіреді, сол сияқты шетелдік кілттер де КЕСТЕ ЖАСАУ SQL операторы.

ЖАСАУ КЕСТЕ кесте_аты (   идентификатор    INTEGER  БАСТАУЫШ КІЛТ,   col2  МІНДЕТ ТҮРЛІ(20),   col3  INTEGER,   ...   ШЕТЕЛ КІЛТ(col3)      ӘДЕБИЕТТЕР басқа_стол(перне_көл) ҚОСУЛЫ ЖОЮ КАСКАД,   ... )

Егер сыртқы кілт тек бір баған болса, бағанды ​​келесі синтаксисті қолдану арқылы белгілеуге болады:

АЛТЕР КЕСТЕ <кесте идентификатор>   ҚОСУ [ ШЕКТЕУ <шектеу идентификатор> ]      ШЕТЕЛ КІЛТ ( <баған өрнек> {, <баған өрнек>}... )      ӘДЕБИЕТТЕР <кесте идентификатор> [ ( <баған өрнек> {, <баған өрнек>}... ) ]      [ ҚОСУЛЫ ЖАҢАРТУ <анықтамалық әрекет> ]      [ ҚОСУЛЫ ЖОЮ <анықтамалық әрекет> ]

Сыртқы кілттерді a көмегімен анықтауға болады сақталған процедура мәлімдеме.[қосымша түсініктеме қажет ]

sp_foreignkey қойынды, pktabname, col1 [, col2] ...  [, col8]
ЖАСАУ КЕСТЕ кесте_аты (   идентификатор    INTEGER  БАСТАУЫШ КІЛТ,   col2  МІНДЕТ ТҮРЛІ(20),   col3  INTEGER ӘДЕБИЕТТЕР басқа_стол(баған_атауы),   ... )
  • қойынды: анықталатын шетелдік кілт бар кестенің немесе көріністің атауы.
  • pktabname: сыртқы кілт қолданылатын алғашқы кілті бар кестенің немесе көріністің атауы. Бастапқы кілт анықталған болуы керек.
  • col1: сыртқы кілтті құрайтын бірінші бағанның атауы. Сыртқы кілтте кем дегенде бір баған болуы керек және ең көп дегенде сегіз баған болуы мүмкін.

Анықтамалық әрекеттер

Себебі мәліметтер базасын басқару жүйесі анықтамалық шектеулерді қолданады, егер сілтеме жасалған кестеде жолдар жойылатын болса (немесе жаңартылатын болса), ол деректердің тұтастығын қамтамасыз етуі керек. Егер сілтеме кестелеріндегі тәуелді жолдар әлі де болса, бұл сілтемелерді ескеру қажет. SQL: 2003 ж 5 түрін анықтайды сілтеме әрекеттері мұндай жағдайлар орын алуы керек:

КАСКАД

Кестедегі (сілтеме жасалған) кестедегі жолдар жойылған сайын (немесе жаңартылған), сәйкес келетін шетелдік кілттер бағанымен баланың (сілтеме) кестесінің тиісті жолдары да жойылады (немесе жаңартылады). Бұл каскадты жою (немесе жаңарту) деп аталады.

ШЕКТЕУ

Сілтемедегі немесе сілтеме кестесіндегі мәнге сілтеме жасайтын еншілес кестеде жол болған кезде мәнді жаңарту немесе жою мүмкін емес.

Сол сияқты, егер сілтеме немесе еншілес кестеде сілтеме болса, жолды жою мүмкін емес.

РЕСТРИКТІ (және каскадты) жақсырақ түсіну үшін бірден анықталмаған келесі айырмашылықты байқау пайдалы болар. CASCADE сілтеме әрекеті CASCADE сөзі қолданылатын (бала) кестенің өзі «мінез-құлқын» өзгертеді. Мысалы, ON DELETE CASCADE тиімді түрде «сілтеме жасалған жол басқа кестеден жойылғанда (негізгі кесте), содан кейін жойыңыз менімен бірге«Алайда, RESTRICT сілтеме әрекеті негізгі кестенің» мінез-құлқын «өзгертеді, емес балалар кестесінде, бірақ негізгі кестеде емес, балалар кестесінде RESTRICT сөзі кездеседі! Сонымен, DELETE RESTRICT тиімді түрде былай дейді: «Егер біреу басқа кестеден (мастер-кестеден) жолды өшіргісі келсе, жойылудың алдын алыңыз басқа кестеден (және, әрине, менен де жоймаңыз, бірақ бұл жерде басты мәселе емес). «

RESTRICT-ге Microsoft SQL 2012 және одан бұрынғы нұсқалары қолдау көрсетпейді.

АРАКЕТ ЖОҚ

ЕШҚандай әрекет пен ШЕКТЕУ бір-біріне ұқсамайды. NO ACTION мен RESTRICT арасындағы негізгі айырмашылық - NO ACTION кезінде анықтамалық тұтастық кестені өзгертуге тырысқаннан кейін жасалады. RESTRICT тексеруді орындауға тырыспас бұрын жасайды ЖАҢАРТУ немесе ЖОЮ мәлімдеме. Екі сілтеме әрекеті бірдей әрекет етеді, егер анықтамалық тұтастық тексерілмесе: UPDATE немесе DELETE операторы қатеге әкеледі.

Басқа сөзбен айтқанда, UPDATE немесе DELETE операторы сілтеме кестесінде сілтеме әрекетін қолдана отырып ЖОҚ АРҚЫЛЫ орындалғанда, ДҚБЖ оператордың соңында сілтеме қатынастарының ешқайсысы бұзылмағанын тексереді. Бұл операция шектеуді бұзады деп болжайтын RESTRICT-тен өзгеше. ЕШКІМ ЕМЕС қолданып, триггерлер немесе тұжырымның семантикасының өзі шектеу тексерілген уақытқа дейін ешқандай сыртқы кілттік қатынастар бұзылмайтын соңғы жағдайды тудыруы мүмкін, осылайша тұжырым сәтті аяқталады.

ӨШІРУ, НОЛДЫ ОРНАТУ

Жалпы алғанда, қабылданған іс-қимыл ДББЖ SET NULL немесе SET DEFAULT үшін ON DELETE немесе ON UPDATE бірдей болып табылады: әсер етілген сілтеме атрибуттарының мәні SET NULL үшін NULL, ал SET DEFAULT үшін көрсетілген әдепкі мәнге өзгертілген.

Триггерлер

Анықтамалық іс-шаралар, әдетте, айтылғандай жүзеге асырылады триггерлер (яғни жасырын аттармен жасайтын триггерлер, көбінесе жасырын.) Осылайша, олар пайдаланушы анықтаған триггерлер сияқты шектеулерге ұшырайды және олардың басқа триггерлерге қатысты орындалу ретін ескеру қажет болуы мүмкін; кейбір жағдайларда, орындалу тәртібін дұрыс қамтамасыз ету үшін немесе мутация кестесінің шектеулерімен жұмыс жасау үшін сілтеме әрекетін пайдаланушының анықтаған эквивалентті триггерімен ауыстыру қажет болуы мүмкін.

Тағы бір маңызды шектеу пайда болады транзакцияны оқшаулау: сіздің жолға енгізген өзгертулеріңіз толықтай каскадты жасай алмауы мүмкін, себебі қатарға сіздің транзакцияңыз «көре алмайды», сондықтан қатарға қосыла алмайды. Мысал: сіздің транзакцияңыз клиенттің шотын қайта нөмірлеуге тырысып жатқан кезде, бір уақытта жасалған операция сол клиентке жаңа шот-фактура жасауға тырысады; CASCADE ережесі сіздің транзакцияңыз қайта қарауға болатын барлық шот-фактуралық жолдарды түзетуі мүмкін, ал олардың нөмірлері өзгертілген клиент қатарына сәйкес келуі мүмкін, ал ол жерде деректерді түзету үшін басқа транзакцияға қол жеткізілмейді; екі транзакция жасалған кезде мәліметтер базасы дәйекті деректерге кепілдік бере алмайтындықтан, олардың біреуі кері қайтарылуға мәжбүр болады (көбіне бірінші келгендер қызмет етеді).

ЖАСАУ КЕСТЕ шот (acct_num INT, сома ОНДЫҚ(10,2));ЖАСАУ Триггер ins_sum АЛДЫНДА INSERT ҚОСУЛЫ шот     ҮШІН Әрқайсысы ҚАТАР ОРНАТУ @сома = @сома + ЖАҢА.сома;

Мысал

Шетел кілттерін иллюстрациялаудың алғашқы мысалы ретінде есептік жазбалар базасында шот-фактуралары бар кесте бар және әр шот-фактура белгілі бір жеткізушімен байланысты деп есептейік. Жеткізушілер туралы мәліметтер (мысалы, аты мен мекен-жайы) бөлек кестеде сақталады; әр жабдықтаушыға оны анықтау үшін «жеткізушінің нөмірі» беріледі. Әрбір шот-фактурада сол шот-фактура үшін жеткізушінің нөмірі бар атрибут болады. Сонда, «жеткізушінің нөмірі» - бұл жеткізушілер кестесіндегі негізгі кілт. Шот-фактуралар кестесіндегі сыртқы кілт сол негізгі кілтті көрсетеді. Реляциялық схема келесідей. Бастапқы кілттер қарамен, ал шетелдік кілттер курсивпен белгіленеді.

  Жеткізуші ( Жабдықтаушы нөмірі, Аты, мекен-жайы, түрі) шот-фактуралар ( Шот-фактура нөмірі, Жабдықтаушы нөмірі, Мәтін)

Сәйкес Деректерді анықтау тілі мәлімдеме келесідей.

  ЖАСАУ КЕСТЕ Жеткізуші (     Жабдықтаушы нөмірі  INTEGER ЖОҚ ЖОҚ,     Аты-жөні            ВАРХАР(20) ЖОҚ ЖОҚ,     Мекен-жай         ВАРХАР(50) ЖОҚ ЖОҚ,     Түрі            ВАРХАР(10),     ШЕКТЕУ жабдықтаушы_pk БАСТАУЫШ КІЛТ(Жабдықтаушы нөмірі),     ШЕКТЕУ сан_мән ТЕКСЕРУ (Жабдықтаушы нөмірі > 0) )  ЖАСАУ КЕСТЕ Шоттар (     Шот-фактура нөмірі   INTEGER ЖОҚ ЖОҚ,     Жабдықтаушы нөмірі  INTEGER ЖОҚ ЖОҚ,     Мәтін            ВАРХАР(4096),     ШЕКТЕУ шот-фактура_pk БАСТАУЫШ КІЛТ(Шот-фактура нөмірі),     ШЕКТЕУ сан_мәні ТЕКСЕРУ (Шот-фактура нөмірі > 0),     ШЕКТЕУ жеткізуші_fk ШЕТЕЛ КІЛТ(Жабдықтаушы нөмірі)        ӘДЕБИЕТТЕР Жеткізуші(Жабдықтаушы нөмірі)        ҚОСУЛЫ ЖАҢАРТУ КАСКАД ҚОСУЛЫ ЖОЮ ШЕКТЕУ )

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ Коронель, Карлос (2010). Деректер қоры жүйелері: жобалау, енгізу және басқару. Тәуелсіздік KY: Оңтүстік-Батыс / Cengage оқыту. б. 65. ISBN  978-0-538-74884-1.
  2. ^ а б Элмасри, Рамез (2011). Мәліметтер қоры жүйелерінің негіздері. Аддисон-Уэсли. бет.73 –74. ISBN  978-0-13-608620-8.
  3. ^ Күні, C. J. (1996). SQL стандартына нұсқаулық. Аддисон-Уэсли. б. 206. ISBN  978-0201964264.
  4. ^ Шелдон, Роберт (2005). MySQL-ді бастау. Джон Вили және ұлдары. 119–122 бб. ISBN  0-7645-7950-9.
  5. ^ «Деректер базасының негіздері - шетелдік кілттер». Алынған 2010-03-13.
  6. ^ MySQL AB (2006). MySQL әкімшіге арналған нұсқаулық және тіл туралы анықтама. Sams Publishing. б. 40. ISBN  0-672-32870-4.
  7. ^ Пауэлл, Гэвин (2004). Oracle SQL: мысалдармен секіру. Elsevier. б.11. ASIN  B008IU3AHY.
  8. ^ Муллинс, Крейг (2012). DB2 әзірлеушіге арналған нұсқаулық. IBM Press. ASIN  B007Y6K9TK.
  9. ^ Шелдон, Роберт (2005). MySQL-ді бастау. Джон Вили және ұлдары. б. 156. ISBN  0-7645-7950-9.
  10. ^ Гарсия-Молина, Гектор (2009). Мәліметтер қоры жүйелері: толық кітап. Prentice Hall. бет.93 –95. ISBN  978-0-13-187325-4.

Сыртқы сілтемелер