Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Hekuri
  • kufizimi PRIMAR KEY. Përdorimi i shumë çelësave në një transformim

kufizimi PRIMAR KEY. Përdorimi i shumë çelësave në një transformim

shënim?, (Type i thjeshtë | i ndërlikuar)?, (unik | çelës | çelësi)*

(Shenja ? tregon se elementi mund të shfaqet zero ose një herë, shenja * tregon se elementi mund të shfaqet zero, një ose më shumë herë brenda elementit element.)

Atributet

atribut Përshkrim
id Nuk kërkohet. Përcakton një identifikues unik për një element
emri Nuk kërkohet. Specifikon emrin e elementit. Ky atribut kërkohet nëse elementi prind është një element skeme
ref Nuk kërkohet. I referohet emrit të një elementi tjetër. Atributi ref mund të përfshijë një prefiks të hapësirës së emrit. Ky atribut nuk mund të përdoret nëse elementi prind është një element skeme
lloji Nuk kërkohet. Përcakton ose emrin e një lloji të dhënash të integruar ose emrin e elementit të simpleType ose kompleksType
grupi i zëvendësimit Nuk kërkohet. Përcakton emrin e një elementi që mund të zëvendësohet nga ky element. Ky atribut nuk mund të përdoret nëse elementi prind nuk është një element skeme
default Nuk kërkohet. Përcakton vlerën e paracaktuar të elementit (mund të përdoret vetëm nëse përmbajtja e elementit është lloj i thjeshtë ose tekst)
fikse Nuk kërkohet. Përcakton një vlerë fikse për një element (mund të përdoret vetëm nëse përmbajtja e elementit është e tipit ose tekstit të thjeshtë)
formë Nuk kërkohet. Përcakton formën e elementit. Vlera "kualifikuar" tregon se ky element duhet të kualifikohet me një prefiks të hapësirës së emrit. Vlera "i pakualifikuar" tregon se ky element nuk ka nevojë të kualifikohet me një parashtesë të hapësirës së emrit. Vlera e paracaktuar është vlera e atributit elementFormDefault të atributit të elementit të skemës. Ky atribut nuk mund të përdoret nëse elementi prind është një element skeme
maxNdodh Nuk kërkohet. Përcakton numrin maksimal të herëve që një element mund të shfaqet në një element prind. Vlera mund të jetë çdo numër i plotë >= 0, por nëse duhet të hiqni kufirin e përdorimit, atëherë duhet të specifikoni fjalën kyçe "të pakufizuar". Vlera e paracaktuar është 1. Ky atribut nuk mund të përdoret nëse elementi prind është një element skeme.
min Ndodh Nuk kërkohet. Përcakton numrin minimal të herëve që një element mund të shfaqet në një element prind. Vlera mund të jetë çdo numër i plotë >= 0. Vlera e paracaktuar është 1. Ky atribut nuk mund të përdoret nëse elementi prind është një element skeme
i zbrazët Nuk kërkohet. Përcakton nëse një elementi mund t'i caktohet një eksplicit vlerë zero zero. Një vlerë e vërtetë lejon elementin të vendosë atributin nil në true. Atributi nil përcaktohet si pjesë e hapësirës së emrave XML Schema. Vlera e paracaktuar është false
abstrakte Nuk kërkohet. Përcakton nëse ky element mund të përdoret në dokument. Një vlerë e vërtetë specifikon që elementi nuk mund të përdoret në dokument. Në vend të kësaj, në vend elementi i dhënë duhet të shfaqet një element tjetër, atributi i zëvendësimit Group i të cilit përmban emrin e prefiksuar (QName) të atij elementi. Vlera e paracaktuar është false
bllokoj

Nuk kërkohet. Parandalon përdorimin e një elementi që ka lloji i dhënë trashëgimi, në vend të elementit të dhënë. Mund të jetë #all ose një listë e shtesave/kufizimeve/zëvendësimeve:

  • zgjerimi - çaktivizon përdorimin e elementeve që rrjedhin nga ekstensioni
  • kufizim - ndalon përdorimin e elementeve që rrjedhin nga kufizimi
  • zëvendësimi - ndalon përdorimin e elementeve të zëvendësuar
  • #të gjitha - ndalon përdorimin e elementeve që rrjedhin nga të gjitha metodat e trashëgimisë
final

Nuk kërkohet. Çaktivizon metodën e specifikuar të trashëgimisë së elementit. Mund të jetë #all ose një listë shtesash/kufizimesh:

  • extension - çaktivizon trashëgiminë e një elementi me një shtesë
  • kufizim - ndalon që elementi të trashëgohet duke përdorur një kufizim
  • #all - çaktivizon të gjitha metodat e trashëgimisë
ndonjë atribut Nuk kërkohet. Çdo atribut tjetër jashtë hapësirës së emrave të skemës

Shembuj të përdorimit të elementeve

Shembulli #1
AT shembullin e mëposhtëm deklaruar Skema XML me katër elementë të thjeshtë "fname", "lname", "moshë" dhe "datëlindur":

Shembulli #2
Shembulli i mëposhtëm deklaron një Skemë XML me një element kompleks të tipit "shënim". Elementi "shënim" përmban katër elementë të thjeshtë - "deri", "nga", "titulli" dhe "trupi":

Shembulli #3
Shembulli i mëposhtëm është i ngjashëm me shembullin #2. Dallimi i vetëm është se atributi ref përdoret për t'iu referuar emrave të elementeve:

Elementi Celës përcakton vlerën e një atributi ose elementi si një çelës (jo nul, unik dhe gjithmonë i pranishëm) në elementin që përmban të dokumentit të dhënë. Elementi ka formatin e mëposhtëm:

< parashtesë: Celës

id= ID

emri= NCEmri

(abstrakte?, (përzgjedhës, fushë+ ))

parashtesë: kyç>

Atributet id dhe emriunike.

Celës, përzgjedhësdhefushë:

xs: Celës>

Në këtë shembull, fushat " mbiemri" dhe " mbiemri" përdoret si çelës i emërtuar Emri i plotë.

Elementi çelës kyç përcakton që vlera e një atributi ose elementi përputhet me vlerat përtej çelësi i dhënë ose një element unik dhe ka formatin e mëposhtëm:

< parashtesë: çelës kyç

id= ID

emri= NCEmri

referoj = Qname

(abstrakte?, (përzgjedhës, fushë+))

parashtesa:çelës kyç>

Atributet id dhe emri kanë të njëjtin kuptim si për elementin unike, dhe atributin e kërkuar referojuni specifikon emrin e një elementi kyç ose unik të përcaktuar në këtë ose një skemë tjetër.

Shembull i përdorimit të elementitçelës kyç, përzgjedhësdhefushë:

Në këtë shembull, fushat "@ së pari" dhe "@ e fundit" përputhen me vlerat kryesore të elementit të përcaktuar më lart Emri i plotë.

4.2.9. Përcaktimi i një lloji kompleks në një skemë XML

Lloji i elementit kompleks kompleks Llojiështë një element XML që përmban elementë dhe/ose atribute të tjera. Ekzistojnë katër lloje të elementeve komplekse:

    elemente boshe;

4.2.9.1. Formati i përkufizimit të elementit kompleksLloji

Një përkufizim kompleks i tipit ka formatin e mëposhtëm:

< parashtesë: kompleks Lloji

emri= NCEmri

id= ID

abstrakt = logjike : i rremë

përzier = logjike : i rremë

bllok =(#të gjitha| Listë(zgjerim| kufizim))

përfundimtar =(#të gjitha|Listë(zgjerim|kufizim))

(abstrakte?, (Përmbajtja e thjeshtë | Përmbajtja komplekse |

((sekuencë | grup | të gjitha | zgjedhje)?,

((atributet | atributGrupi)*, ndonjëAtribut?))))

parashtesë: kompleks Lloji>

Atributet emri dhe id në element kompleks Lloji kanë të njëjtin kuptim si në element atributet, ndërsa atributet abstrakte, bllokoj dhe final- të njëjtin kuptim si në element element. atribut të përziera përcakton nëse të dhënat e karaktereve mund të shfaqen midis elementeve fëmijë të një përkufizimi kompleks të tipit.

Siç mund ta shihni nga përkufizimi i tipit kompleks, këtij elementi mund t'i jepet një nga opsionet e mëposhtme të përmbajtjes:

    element Përmbajtja e thjeshtë;

    element Përmbajtja komplekse;

    një nga elementet grup, të gjitha, zgjedhje ose sekuencë(0 ose 1 herë), një nga elementët atributet ose atributGrupi(0 ose më shumë herë) dhe element ndonjëAtribut(0 ose 1 herë).

Merrni parasysh elementet fëmijë element kompleks Lloji.

4.2.9.2. sekuenca, çdo, zgjedhja, të gjitha dhe elementet e grupit

Elementi sekuencë specifikon që elementët fëmijë të elementit të dhënë duhet të shfaqen në sekuencën e specifikuar dhe ka formatin e mëposhtëm:

< parashtesë: sekuencë

id= ID

maxNdodh = (joNegativeInteger | të pakufizuara) : 1

min Ndodh = joNegativeInteger : 1

(abstrakte?, (element | grup | zgjedhje | sekuencë | ndonjë)*)

parashtesë: sekuencë>

Atribut opsional idmaxNdodh dhe min Ndodh vendosni vlerën maksimale dhe minimale për numrin e përfshirjeve të sekuencës së dhënë në elementin prind.

Shembullpërdornielementsekuenca:

xs: element>

Në shembull, një element me emrin personinfo(informacionet e punonjësve). Ky element përmban elementë fëmijë Emri dhe mbiemri, si dhe sekuencën e elementeve fëmijë(fëmijë) - kjo sekuencë mund të mungojë ose të përmbajë një numër të pakufizuar elementësh fëmijë.

Siç mund ta shihni nga deklarata e elementit sekuencë, përmbajtja e këtij elementi mund të përmbajë një element fëmijë ndonjë. Ky element ju lejon të zgjeroni dokumentin XML me elementë që nuk janë të përcaktuar në skemë dhe ka formatin e mëposhtëm:

< parashtesë: ndonjë

id= ID

maxNdodh = (joNegativeInteger | të pakufizuara) : 1

min Ndodh = joNegativeInteger : 1

hapësira e emrit = ((##ndonjë| ##tjetër) | Listë (çdo URI |

(##targetHapësira e emrave| ##lokal))) : ##ndonjë

procesPërmbajtja = (i rreptë| i dobët| kaloni) : i rreptë

(abstrakte?)

parashtesë: ndonjë>

Atribut opsional id specifikon një identifikues unik për elementin dhe atributet opsionale maxNdodh dhe min Ndodh vendosni vlerën maksimale dhe minimale për numrin e përfshirjeve të elementeve ndonjë te elementi prind. Atribut opsional hapësira e emrit përcakton hapësirat e emrave që përmbajnë elementë që mund të përdoren në një element prind dhe mund të jetë një nga vlerat e mëposhtme:

    ## ndonjë– Lejohen elemente nga çdo hapësirë ​​emri;

    ## tjera– mund të jenë të pranishëm elementë nga çdo hapësirë ​​emri, përveç hapësirës së emrave të specifikuar për elementin prind;

    ## lokal– elementet duhet të specifikohen jo nga hapësira e emrave;

    ## objektivhapësira e emrit– mund të jenë të pranishëm elementë nga hapësira e emrave të specifikuar për elementin prind;

    Listë(çdo URI| (## hapësira e emrave të synuar|## lokal))) - mund të jenë të pranishëm elementë nga lista e dhënë.

Atribut opsional Përmbajtja e procesit përcakton se si procesori XML duhet të organizojë përpunimin e elementeve të përcaktuar nga ky element ndonjë dhe mund të ketë një nga vlerat e mëposhtme:

    i rreptë– procesori XML duhet të marrë skemën e hapësirave të kërkuara të emrave dhe të vërtetojë elementet;

    i dobët- i ngjashëm i rreptë, por nëse skema nuk mund të merret, nuk gjenerohet asnjë mesazh gabimi;

    kaloni– Procesori XML anashkalon vërtetimin e elementeve.

ndonjë:

< xs: elementemri=" person">

xs: kompleks Lloji>

xs: element>

Duke përdorur elementin ndonjë ju mund të zgjeroni përmbajtjen e elementit person(pas elementit mbiemri) nga çdo element tjetër.

Elementi zgjedhje lejon vendosjen në elementin prind vetëm një nga elementët e pranishëm në listë dhe ka formatin e mëposhtëm:

< parashtesë: zgjedhje

id= ID

maxNdodh = (joNegativeInteger | të pakufizuara) : 1

min Ndodh = joNegativeInteger : 1

(abstrakte?, (element | grup | zgjedhje | sekuencë | ndonjë)*)

parashtesë: zgjedhje>

Atribut opsional id specifikon një identifikues unik për elementin dhe atributet opsionale maxNdodh dhe min Ndodh vendosni vlerën maksimale dhe minimale për numrin e përfshirjeve të elementit të zgjedhur në elementin prind.

Shembullpërdornielementzgjedhja:

< / xs:element>

Elementi person duhet të përmbajë një nga elementët e përshkruar më parë: punonjës(punonjës i përhershëm) ose i pavarur(kontraktor).

Elementi të gjitha specifikon që elementët që ai përmban mund të shfaqen në elementin prind në çdo rend dhe çdo element mund të shfaqet 0 ose 1 herë. Elementi ka formatin e mëposhtëm:

< parashtesë: të gjitha

id= ID

maxNdodh = 1 : 1

min Ndodh = (0 | 1 ) : 1

(abstrakte?, element*)

parashtesë: të gjitha>

Atribut opsional id specifikon një identifikues unik për elementin. Atribut opsional maxNdodh duhet të ketë vlerën 1 dhe atributin opsional min Ndodh vendos vlerën minimale për numrin e herëve që elementi i zgjedhur përfshihet në elementin prind ( 0 ose 1 ).

Shembull i përdorimit të elementittë gjitha:

< xs: elementemri=" person">

Elementet Emri dhe mbiemri mund të shfaqet në një element në një element person në çdo mënyrë, dhe një ose të dy elementët mund të mungojnë.

Elementi grup përdoret për të specifikuar një grup elementesh në një përcaktim kompleks të tipit dhe ka formatin e mëposhtëm:

< parashtesë: grup

id= ID

emri= NCEmri

ref= Qname

maxNdodh = joNegativeInteger | të pakufizuara : 1

min Ndodh = joNegativeInteger : 1

(abstrakte?, (të gjitha | zgjedhje | sekuencë))

parashtesë: grup>

atribut emri specifikon emrin e elementit. Kërkohet vetëm nëse prindi i elementit është element skema ose element ripërcaktoje. atribut ref specifikon një lidhje me emrin e një grupi tjetër (atributet emri dhe ref janë reciprokisht ekskluzive). Atributet opsionale maxNdodh dhe min Ndodh vendosni vlerën maksimale dhe minimale për numrin e përfshirjeve të elementeve të grupit në elementin mëmë.

Shembull i përdorimit të elementitgrup:

< xs: grupemri=" Grup i personalizuar">

xs: kompleks Lloji>

Në këtë shembull, një grup është përcaktuar Grup i personalizuar, i përbërë nga dy elementë: klient(blerës) dhe Detajet e porosisë(detajet e rendit) dhe më pas ky grup përdoret (me referencë) në përkufizimin e një lloji kompleks Lloji i porosisë.

Pyetjet e nevojshme që zhvilluesi të krijojë aplikacionet klient-server duke përdorur Firebird DBMS, i cili është një evolucion i Borland Interbase 6 DBMS. Ofrohet një pasqyrë e koncepteve dhe modeleve të arkitekturës së klientit/serverit, si dhe këshilla praktike për të punuar me bibliotekat e klientëve të Firebird. Karakteristikat e llojeve janë përshkruar në detaje Të dhënat SQL, Gjuha e manipulimit të të dhënave (DML) dhe sintaksa dhe operatorët e gjuhës së përkufizimit të të dhënave (DDL). Shumë vëmendje i kushtohet përshkrimit të transaksioneve dhe këshillave për përdorimin e tyre në zhvillimin e aplikacioneve. Ai përshkruan programimin në anën e klientit dhe serverit, shkrimin e nxitësve dhe procedurat e ruajtura, krijimin dhe përdorimin e ngjarjeve të bazës së të dhënave, trajtimin e gabimeve në kod në server dhe shumë më tepër. Materiali shoqërohet me shembuj, këshilla dhe rekomandime praktike të shumta.

Për zhvilluesit e bazës së të dhënave

Libri:

kufizimi PRIMAR KEY

Seksionet në këtë faqe:

kufizimi PRIMAR KEY

ÇELËSI PRIMARY është një kufizim i integritetit në nivel kolone - një grup rregullash të ruajtura - që shënon zyrtarisht një kolonë ose grup kolonash si një identifikues unik për çdo rresht në një tabelë.

Nëse vini te Firebird nga RDBMS që mbështesin konceptin e një "indeksi primar" për përcaktimin e një çelësi (zakonisht sisteme të bazuara në skedarë si Paradox, Access dhe MySQL), atëherë Firebird dhe bota Standardet SQL e kuptoni. Çelësi kryesor nuk është një indeks, por një kufizim. Një nga rregullat për një kufizim të tillë është që kufizimi duhet të ketë një specifikë indeks unik të një ose më shumë elementeve jo bosh që lidhen me të.

Thjesht krijimi i një indeksi të tillë nuk krijon një çelës primar. Megjithatë, krijimi i një kufizimi kryesor të çelësit rezulton në krijimin e indeksit të kërkuar të përbërë nga kolonat e listuara në deklaratën e kufizimit.

KUJDES! Ju nuk keni nevojë të importoni një "indeks primar" ekzistues nga një sistem i vjetër i bazuar në skedarë, ose të krijoni një indeks të tillë ndërsa prisni që të deklarohet një kufizim kryesor i çelësit. Firebird nuk mund të vendosë një kufizim kryesor kryesor mbi një indeks ekzistues - nga të paktënversionet ekzistuese, duke përfshirë 1.5 - dhe optimizuesi i pyetjeve nuk do të funksionojë siç duhet me indekse të dyfishta.

Një tabelë mund të ketë vetëm një çelës primar. Kur përcaktoni një kufizim, Firebird krijon automatikisht indeksin e kërkuar duke përdorur një grup rregullash të emërtuara. Emrat e indeksit të çelësit kryesor do të diskutohen në vijim.

KUJDES! Nëse po konvertoni një bazë të dhënash në Firebird nga çdo burim tjetër përveç InterBase ose Oracle, atëherë duhet Vëmendje e veçantë për skemë për emrat dhe kufizimet kryesore të çelësit.

Megjithëse kufizimi PRIMARY KEY në vetvete nuk është një kufizim referues, ai është zakonisht një pjesë e kërkuar e çdo kufizimi referues, duke qenë objektivi i mundshëm i klauzolës REFERENCAT e një kufizimi KYÇE TË HUAJ. Shihni kapitullin 17 për detaje.

Zgjedhja e një çelësi primar

Identifikimi i kolonave si kandidatë për një çelës primar është jashtë fushëveprimit të këtij botimi. Shumë libra të shkëlqyer janë shkruar për normalizimin, procesin e reduktimit të tepricës dhe përsëritjes së grupeve në grupet e të dhënave dhe identifikimin e saktë të një elementi që përfaqëson në mënyrë unike një rresht të vetëm në një tabelë. Nëse jeni i ri në bazat e të dhënave relacionale, nuk do të kushtojë shumë për të lexuar një libër të mirë për modelimin e të dhënave.

Një kandidat kyç primar, i cili mund të jetë një kolonë e vetme ose një grup kolonash, ka dy kërkesa të detyrueshme.

* Atributi NOT NULL duhet të deklarohet për të gjitha kolonat në një grup prej një ose më shumë kolonash. Integriteti i çelësit mund të zbatohet vetëm duke krahasuar vlerat dhe NULL nuk është një vlerë.

* Një kolonë ose grup kolonash duhet të jetë unike - domethënë, nuk mund të ketë më shumë se një rresht me të njëjtat vlera në një tabelë. Për shembull, një numër patentë shoferi ose sigurimet shoqerore mund të konsiderohen kandidatë sepse ato gjenerohen nga sisteme që nuk lejojnë numra dublikatë.

Këtyre "cilësimeve" teorike duhet t'u shtohet një e treta.

* Madhësia totale e çelësave kandidatë duhet të jetë 252 bajt ose më pak. Nuk ka të bëjë vetëm me numërimin e personazheve. Ky kufi duhet të reduktohet - në disa raste - në mënyrë drastike - nëse ka kolona të shumta, një sekuencë renditje jo-binare ose një grup karakteresh me shumë bajtë.

Si të dhënat reale mund t'ju çojnë në dështim

Duke përdorur tabelën EMPLOYEE në bazën e të dhënave punonjës.fdb nga drejtoria /examples në direktorinë rrënjësore të Firebird (employee.gdb në versionin 1.0.x), le të shohim se si të dhënat reale mund t'i bëjnë të gabuara supozimet tuaja teorike rreth unike. Këtu është një deklaratë që tregon të dhëna domethënëse të ruajtura në këtë tabelë:

KRIJO PUNONJËSIN E TABELËS (

FIRST_NAME VARCHAR(15) JO NULL,

/* me mend: punonjësi duhet të ketë një emër */

LAST_NAME VARCHAR(20) JO NULL,

/* supozimi: punonjësi duhet të ketë mbiemrin */

PHONE_EXT VARCHAR(4),

HIRE_DATA DATA DEFAULT CURRENT_DATA JO NULL,

DEPT_NO CHAR(3) JO NULL,

KODI_PUNËS VARCHAR(5) JO NULL,

PUNË_GRADE I VOGËL JO NULL,

JOB_COUNTRY VARCHAR(15) JO NULL,

NUMERIK I PAGËS (15, 2) I PARAKTUAR 0 JO NULL,

FULL_NAME LLOGARITUR NGA FIRST_NAME || "" || MBIEMRI);

Në fakt, kjo strukturë nuk ka asnjë kandidat kyç. Nuk është e mundur të identifikohet një rresht i vetëm punonjësi duke përdorur (FIRST_NAME, LAST_NAME) si çelës, sepse kombinimi i dy elementëve mund të ketë një probabilitet mesatar deri në të lartë për t'u dublikuar në organizatë. Ne nuk do të jemi në gjendje të mbajmë të dhëna për dy punonjës të quajtur John Smith.

Për të marrë çelësat, duhet të shpikni diçka. Kjo "diçka" është një mekanizëm i njohur si një çelës zëvendësues.

Çelësat zëvendësues

Ne kemi trajtuar tashmë një çelës zëvendësues në temën hyrëse mbi çelësat në Kapitullin 14. Një çelës primar zëvendësues është një vlerë që garanton unike dhe nuk ka asnjë kuptim që përdoret si zëvendësim për një çelës në një strukturë tabele që nuk mund të sigurojë një kandidat kyç në strukturën e vet. Për këtë arsye, EMP_NO (deklaruar përmes domenit) shtohet në tabelën EMPLOYEE për të vepruar si një çelës zëvendësues:

KRIJO DOMAIN EMPNO SMALLINT;

ALTER PUNONJËS TABELA

SHTO EMP_NO EMPNO JO NULL,

SHTO KUFIZIM PK_EMPLOYEE

PRIMARYKEY (EMP_NO) ;

Kjo bazë të dhënash përmban gjithashtu një gjenerator të quajtur EMP_NO_GEN dhe një aktivizues të futjes përpara me emrin SET_EMP_NO në tabelën EMPLOYEE për të marrë vlerën e këtij çelësi në momentin e futjes. linjë e re. Në sek. "Zbatimi i çelësave të rritjes automatike" në kapitullin 31 përshkruan këtë teknikë në detaje. Kjo është mënyra e rekomanduar për të zbatuar çelësat zëvendësues në Firebird.

Ju mund të dëshironi të merrni parasysh përfitimet e përdorimit të një çelësi parësor zëvendësues, jo vetëm në rastet kur tabela nuk mund të sugjerojë një kandidat, por edhe në rastet kur kandidati juaj kryesor është i përbërë.

Çelësat kryesorë të përbërë

Në procesin e analizës së të dhënave, ndonjëherë është e mundur të gjendet një kolonë e vetme unike në një strukturë të dhënash. Teoria është për të gjetur dy ose më shumë kolona të grupuara së bashku si një çelës që do të garantojë uniken e rreshtit. Kur shumë kolona kombinohen për të formuar një çelës, çelësi quhet një çelës i përbërë ose ndonjëherë një çelës kompleks.

Nëse keni pasur përvojë me sistemet e bazës së të dhënave si Paradox që përdorën çelësa të përbëra për të zbatuar marrëdhënie hierarkike, ndoshta do ta keni të vështirë të hiqni dorë nga ideja se duhet të jetoni pa to. Akoma, në praktikë, çelësat e përbërë duhet të konsiderohen shumë të kufizuar në DBMS si Firebird, ku nuk ka përshkim të strukturave të indeksit fizik në disk për të zbatuar marrëdhëniet.

Në Firebird, nuk ka nevojë për indekse të përbëra, dhe për më tepër, indekset e përbëra krijojnë disa probleme të projektimit dhe performancës për tabela të mëdha.

* Çelësat e përbërë zakonisht përbëhen nga elementë kyç joatomikë - d.m.th. kolonat e përzgjedhura kanë kuptim semantik (ato janë "të dhëna kuptimplote") dhe janë padyshim të prekshme ndaj ndryshimet e jashtme dhe gabimet e hyrjes manuale.

* Çelësat e huaj nga tabelat e tjera që i referohen kësaj tabele do të kopjojnë çdo element të çelësit të përbërë. Integriteti i referencës rrezikohet kur përdoren çelësa joatomikë. Kombinimi i elementeve joatomike rrit rrezikun.

* Çelësat - të huaj si dhe primar - kanë indekse të përhershme. Indekset e përbëra kanë kufij më të rreptë të madhësisë sesa indekset me një kolonë.

* Indekset e përbëra priren të madhësive të mëdha. Indekset e mëdha përdorin më shumë faqe të bazës së të dhënave, duke bërë që operacionet e indeksit (rendimi, bashkimi dhe krahasimi) të jenë më të ngadalta se ç'duhet.

Atomiciteti i kolonave të çelësit primar

Është praktikë e mirë të mos përfshihet asnjë kolonë që ka kuptim si të dhëna në çelësat kryesorë dhe të huaj. Kjo shkel një nga parimet bazë të projektimit të bazave të të dhënave relacionale - atomicitetin. Parimi i atomicitetit kërkon që çdo element i të dhënave të ekzistojë tërësisht më vete me një të vetme rregull i brendshëm menaxhimin e ekzistencës së saj.

Që një çelës kryesor të jetë atomik, ju duhet të jeni jashtë vendimeve njerëzore. Nëse njerëzit e kompozojnë ose e klasifikojnë, nuk është atomike. Nëse është subjekt i ndonjë rregulli tjetër përveç kërkesave NOT NULL dhe unike, ai nuk është atomik. Në shembullin e mësipërm, edhe një patentë shoferi ose numri i sigurimeve shoqërore nuk plotëson kërkesat e atomicitetit për një çelës primar, sepse ato janë subjekt i sistemeve të jashtme.

Sintaksa e deklarimit të çelësit primar

Ju mund të përdorni disa sintaksa për të caktuar një kufizim PRIMARY KEY në një kolonë ose grup kolonash. Të gjitha kolonat që janë anëtarë të çelësit primar duhet të paracaktohen me atributin NOT NULL. Meqenëse nuk mund të shtoni një kufizim NOT NULL në një kolonë pasi të jetë krijuar, duhet të kujdeseni për këtë kufizim përpara se të përdorni kufizime të tjera.

Një kufizim KRYESOR PRIMAR mund të zbatohet në cilëndo nga fazat e mëposhtme të krijimit të meta të dhënave:

* në përkufizimin e një kolone në një deklaratë CREATE TABLE ose ALTER TABLE si pjesë e përkufizimit të kolonës;

* në një përkufizim tabele në një deklaratë CREATE TABLE ose ALTER TABLE si një kufizim i përcaktuar veçmas i tabelës.

Përkufizimi i çelësit primar si pjesë e përkufizimit të kolonës

Sekuenca e mëposhtme krijon dhe kryen një domen që nuk e lejon vlerë boshe, atëherë përcaktohet një kolonë e çelësit primar bazuar në atë domen dhe një kufizim PRIMARY KEY aplikohet njëkohësisht në atë kolonë:

KRIJO DOMAIN D_IDENTITY SI I MADH JO NULL;

KRIJO PERSON I TABELËS (

ÇELËSI PRIMAR PERSON_ID D_IDENTITY,

Firebird krijon një kufizim tabele të quajtur INTEG_M dhe një indeks të quajtur RDB$PRIMARYnn. (pl në çdo rast është numri i dhënë nga gjeneruesi. Dy numrat nuk kanë lidhje me njëri-tjetrin.) Ju nuk mund të ndryshoni se çfarë janë këta emra dhe nuk mund t'i ndryshoni.

Rezultati do të jetë i ngjashëm nëse përdorni të njëjtën qasje kur shtoni një kolonë duke përdorur deklaratën ALTER TABLE dhe krijoni çelësin kryesor në një fjali:

ALTER TABELIN

SHTO LIBRIT_ID D_IDENTITY ÇELËSI PRIMAR;

Përcaktimi i një çelësi primar si një kufizim i emërtuar

Një mënyrë tjetër për të përcaktuar një çelës primar në përkufizimin e një tabele është të shtoni një deklaratë kufizimi në fund të përkufizimeve të kolonës. Deklaratat e kufizimeve vendosen të fundit sepse varen nga ekzistenca e kolonave të cilave u referohen. Kjo metodë ju jep mundësinë për të emërtuar kufizime. Deklarata e mëposhtme i referohet kufizimit të çelësit primar si PK_ATABLE:

KRIJO TABELE TABELE (

ID BIGINT JO NULL,

ANOTHER_KOLONA VARCHAR(20),

KUFIZIM PK_ATABLE ÇELËSI PRIMAR (ID));

Firebird tani përdor PK_ATABLE si emër të këtij kufizimi në vend që të përdorë emrin e krijuar nga sistemi RDB$PRIMARYnnn. Në Firebird 1.5 dhe më lart, ai gjithashtu zbaton një emër kufizimi të përcaktuar nga përdoruesi për indeksin unik mbështetës. Në këtë shembull, indeksi do të quhet PK_ATABLE, kur versionet e tjera do ta emërojnë atë RDB$PRIMARYnnn.

Gjatë procesit të projektimit të bazës së të dhënave, merret një vendim se cilat tabela duhet të përfshihen në bazën e të dhënave, çfarë emrash (identifikues) do të kenë, çfarë lloje të dhënash do të kërkohen për të ndërtuar tabelat dhe cilët përdorues do të kenë akses në secilën prej tyre. ato. Përveç kësaj, për krijimi efektiv tabela për t'iu përgjigjur pyetjeve të mëposhtme:

  • Çfarë lloji dhe madhësie kolonash do të përbëjnë secilën nga tabelat, çfarë emrash duhet të zgjidhen për kolonat e tabelave?
  • Çfarë kolonash mund të përmbajnë vlerë zero ?
  • A do të përdoren kufizimet e integritetit, vlerat e paracaktuara dhe rregullat për kolonat?
  • A është e nevojshme të indeksohen kolonat, çfarë lloje indeksesh do të aplikohen për kolona specifike?
  • Cilat kolona do të përfshihen në çelësat kryesorë dhe të huaj.

Për të krijuar tabela në mjedisin MS SQL Server përdoret komanda:

<определение_таблицы>::= KRIJO TABELE [ emri_bazës.[pronari]. | pronar. ]emri_tabele (<элемент_таблицы>[,...n])

<элемент_таблицы> ::= {<определение_столбца>} | <имя_столбца>AS<выражение> | <ограничение_таблицы>

Zakonisht pronari i tabelës (dbo) është personi që e ka krijuar atë.

<Выражение>vendos vlerën për kolona e llogaritur. Kolonat e llogaritura janë kolona virtuale, pra nuk ruhen fizikisht në tabelë dhe llogariten duke përdorur vlerat e kolonave të së njëjtës tabelë. Në shprehjen për kolona e llogaritur Emrat e rregullt të kolonave, konstantet dhe funksionet e lidhura me një ose më shumë operatorë mund të jenë të pranishëm. Nënpyetjet në një shprehje të tillë nuk mund të marrin pjesë. Kolonat e llogaritura mund të përfshihen në ZGJIDH seksionin kur specifikoni një listë të kolonave që do të kthehen si rezultat i ekzekutimit të pyetjes. Kolonat e llogaritura nuk mund të jenë pjesë e një çelësi të huaj, ata nuk përdorin vlera të paracaktuara. Përveç kësaj, kolonat e llogaritura nuk mund të marrë pjesë në operacionet INSERT dhe DELETE.

<определение_столбца>::= (emri_kolona<тип_данных>) [ [ PARALAKTUAR<выражение>] | [ IDENTITET (fillimi, hapi) ]]] [<ограничение_столбца>][...n]]

Në përkufizimin e kolonës, kushtojini vëmendje parametrit IDENTITY, i cili tregon se kolona përkatëse do të jetë kolona kundër. Vetëm një kolonë me këtë veti mund të përcaktohet për një tabelë. Ju gjithashtu mund të specifikoni vlera fillestare dhe hapi i rritjes. Nëse këto vlera nuk janë të specifikuara, ato të dyja janë të paracaktuara në 1. Nëse fjalë kyçe IDENTITETI NUK ËSHTË PËR REPLIKIM, atëherë serveri nuk do të gjenerojë automatikisht vlera për atë kolonë, por do të lejojë që vlerat arbitrare të futen në kolonë.

Kufizimet janë kufizimet e kolonës dhe kufizimet e tabelës. Dallimi mes tyre është se kufizimi i kolonës vlen vetëm për një fushë specifike, dhe kufizimi i tabelës- në grupe të një ose më shumë fushave.

<ограничение_столбца>::= [ KUFIZIMI I KUFIZIMIT ] ( [ NULL | JO NULL ] | [ (ÇELËSI PRIMAR | UNIK ) [ TË GJENDUR | NUK LUSHTER ] [ ME FILLFACTOR=fillfaktor ] [ ON (emri i grupit të skedarit | DEFAULT ) [REFALIM )]] emri_tabela_genus [(column_emri_table_genus) ] [ NË FSHIJE ( KASKAD | JO VEPRIM ) ] [ NË PËRDITËSIM ( KASKADË | JO VEPRIM ) ] [ JO PËR KONTROLLIM ]] | KONTROLLO [ JO PËR REPLIKIM](<лог_выражение>) } <ограничение_таблицы>::= ( [ (ÇELËSI PRIMARY | UNIK ) [ TË GRUPTUAR | JO GJITHË ] ((emri_kolona [,...n])) ] |ÇELËSI i HUAJ[(emri_kolona [,...n])] REFERENCAT emri_tabela_gjini [(emri_kolona_tabela_gjini ,...n])] [ NË FSHIJE (KASKADË | JO VEPRIM) ] [ NË PËRDITËSIM (KASKADË | JO VEPRIM )] | JO PËR KONTROLLIM ] | KONTROLLO [ JO PËR REPLIKIM ] (boolean) )

Konsideroni parametrat individualë të strukturave të paraqitura që lidhen me kufizimet integriteti i të dhënave. Kufizimet e integritetit kanë përparësi ndaj nxitësve, rregullave dhe parazgjedhjeve. për të kufizimet e integritetit lidhen kufizimi kryesor i çelësitÇELESI PRIMAR , kufizimi i çelësit të huajÇELËSI I HUAJ, kufizim UNIK, kufizim vlerash NULL, KONTROLLO.

Kufizimi i çelësit primar (ÇELËSI PRIMARY)

Një tabelë zakonisht ka një kolonë ose kombinim kolonash, vlerat e të cilave identifikojnë në mënyrë unike çdo rresht në tabelë. Kjo kolonë (ose kolona) quhet çelesi primar tabelë dhe është e nevojshme për të siguruar integritetin e saj. Nëse ka më shumë se një kolonë në çelësin primar, atëherë vlerat brenda një kolone mund të dublikohen, por çdo kombinim vlerash nga të gjitha kolonat çelesi primar duhet të jetë unike.

Gjatë krijimit çelesi primar SQL Server krijon automatikisht një indeks unik në kolonat që janë pjesë e një çelësi primar. Përshpejton aksesin e të dhënave të atyre kolonave kur përdorni çelesi primar në kërkesat.

Një tabelë mund të ketë vetëm një kufizim PRIMARY KEY dhe asnjë nga kolonat e përfshira në çelësin primar nuk mund të jetë NULL. Kur përpiqeni të përdorni si çelesi primar kolona (ose grup kolonash) për të cilat kufizimet kryesore kryesore nuk ekzekutohen, çelësi primar nuk do të krijohet dhe sistemi do të shfaqë një mesazh gabimi.

Meqenëse kufizimi PRIMARY KEY garanton unike të të dhënave, ai shpesh përcaktohet për kolona kundër. Krijim kufizimet e integritetitÇELËSI PRIMAR është i mundur si gjatë krijimit ashtu edhe gjatë ndryshim tavoline. Një nga takimet çelesi primarështë për të siguruar integriteti referues të dhëna të shumta të tabelës. Natyrisht, kjo mund të zbatohet vetëm duke përcaktuar çelësat e huaj përkatës në tabela të tjera.

Kufizimi i çelësit të huaj (ÇELËSI I HUAJ)

kufizimi i çelësit të huajështë mekanizmi kryesor për mirëmbajtjen integriteti referues mes tavolinave bazë relacionale të dhëna. Kolona e tabelës së fëmijës e specifikuar si një çelës i huaj në parametrin FOREIGN KEY përdoret për t'iu referuar kolonës së tabelës mëmë që është në të. çelesi primar. Emri dhe kolonat e tabelës prind çelesi primar janë të specifikuara në klauzolën REFERENCAT. Të dhënat në kolonat e përcaktuara si një çelës i huaj mund të marrin vetëm të njëjtat vlera si në kolonat e lidhura me të çelesi primar tabela e prindërve. Nuk është e nevojshme që emrat e kolonave të përputhen me tabelat e prindërve dhe fëmijëve. Një çelës primar mund të përkufizohet për një kolonë me një emër, ndërsa një kolonë që i nënshtrohet një kufizimi FOREIGN KEY mund të ketë një emër krejtësisht të ndryshëm. Kërkesa e vetme është që kolonat të përputhen në llojin dhe madhësinë e të dhënave.

Çelësi primar mund të referohet jo vetëm nga kolonat e tabelave të tjera, por edhe nga kolonat e vendosura në të njëjtën tabelë si vetë çelësi primar; kjo ju lejon të krijoni struktura rekursive.

Një çelës i huaj mund të lidhet jo vetëm me çelesi primar një tavolinë tjetër. Mund të përcaktohet gjithashtu në kolona me një kufizim UNIK në tabelën e dytë ose në ndonjë kolonë tjetër, por tabelat duhet të jenë në të njëjtën bazë të dhënash.

Kolonat e çelësave të huaj mund të përmbajnë NULL, por kontrolli i kufizimit të ÇELËSIT TË HUAJ injorohet. Çelësi i huaj mund të indeksohet, atëherë serveri do të gjejë të dhënat e nevojshme më shpejt. Çelësi i huaj përcaktohet si në krijimin ashtu edhe në ndërrimi i tavolinave.

Kufizimi integriteti referues specifikon një kërkesë që për çdo rekord në tabelën fëmijë, duhet të ketë një rekord në tabelën prind. Në këtë rast, bllokohet ndryshimi i vlerës së kolonës së lidhjes në rekordin e tabelës mëmë në prani të një regjistrimi fëmijëror, si dhe fshirja e regjistrimit prind (duke ndaluar ndryshimet dhe fshirjet në kaskadë), i cili garantohet me parazgjedhjen ON DELETE NO. VEPRIM dhe NË PËRDITËSIM PA parametra VEPRIM. Për të aktivizuar kaskadimin, përdorni opsionet ON DELETE CASCADE dhe ON UPDATE CASCADE.

Artikujt kryesorë të lidhur