mik azok a kulcsok és kényszerek?
az adatbázisnak meg kell felelnie bizonyos tulajdonságoknak a tárolt adatok integritásának és minőségének megőrzése érdekében. A kulcsok és korlátozások olyan szabályok, amelyek meghatározzák, hogy milyen adatértékek engedélyezettek bizonyos adatoszlopokban. Ezek fontos adatbázis-fogalmak, és az adatbázis sémadefiníciójának részét képezik. A kulcsok és korlátozások meghatározása az adatbázis-tervezési folyamat része, és biztosítja, hogy az adatbázisban lévő adatok megbízhatóak és megőrizzék integritását. A korlátozások vonatkozhatnak egy adott oszlopra, egy teljes táblára, egynél több táblára vagy egy teljes sémára. A megbízható adatbázis-rendszer biztosítja, hogy a korlátozások mindenkor fennmaradjanak. A kulcsok egy speciális kényszertípus, amelyet a kapcsolatok és az egyediség megteremtésére használnak.
elsődleges kulcs
két entitás vagy két adat közötti kapcsolatok létrehozásának szükséges része az adatok helyes azonosítása. Az SQL-ben az egyedi azonosító adatok kritikusak. Az elsődleges kulcs egy adatsor egyedi azonosítója. Az eddig használt táblázatkezelő analógiában mindig volt egy id
oszlop. Bár bármely oszlop szolgálhat elsődleges kulcsként, a id
nevű oszlop használata egyszerű mnemonikus okokból, és népszerű konvenció. Egy RDBMS-ben minden táblának csak egy elsődleges kulcsa lehet.
az elsődleges kulcs a táblázat egy sorának garantált egyedi azonosítója. Emiatt egy sor elsődleges kulcsértékével hivatkozhatunk arra a sorra más táblákból. Az előző fejezetben ennek alapján hoztunk létre kapcsolatokat több tábla között, de a relációs adatbázisoknak szükségük van arra, hogy egymáshoz kapcsolódjanak, az elsődleges kulcs oszlop pedig ennek hatékony módja. A PostgreSQL-ben az elsődleges kulcsok teljesítményelőnyöket is kapnak, mivel ismert, hogy gyakran használják az adatok keresésére, különösen a többasztalos kereséseknél.
ne feledje, hogy nem minden “id” nevű oszlop elsődleges kulcs; ez csak egy konvenció. Ezenkívül az elsődleges kulcsoknak bármilyen neve lehet.
az előző fejezetekben már láttuk az oszlop elsődleges kulcs oszlopként való kijelölésének szintaxisát:
vessünk egy pillantást a fenti parancsra, amely az elsődleges kulcsok megértése szempontjából létrehoz egy users
nevű táblát.
-
id
az oszlop a táblázat elsődleges kulcsa. Azt is mondhatjuk, hogy az elsődleges Kulcskorlátot aid
oszlopra alkalmazták. -
id
csak numerikus értékeket tartalmazhat (int
). - a táblázathoz hozzáadott minden új sor esetében a
id
mező automatikusan 1-gyel növekszik. Sok RDBMS esetén aAUTO_INCREMENT
kulcsszót használják. A PostgreSQL-nél a serial-t használjuk az azonosítóink automatikus növeléséhez, és a típusukat egész számként állítjuk be. Nem szükséges manuálisan megadni az elsődleges kulcs értékét minden alkalommal, amikor adatokat illeszt be, a PostgreSQL megteszi az Ön számára, ha a serial értéket adja meg az azonosító típusaként.
idegen kulcs
idegen kulcs oszlopokat használnak egy másik adatsor hivatkozására, esetleg egy másik táblázatban. Egy másik sorra való hivatkozáshoz az adatbázisnak egyedi azonosítóra van szüksége az adott sorhoz. Ezért az idegen kulcs oszlopok tartalmazzák a hivatkozott sor elsődleges kulcsának értékét. Például egy táblának lehet egy user_id
nevű oszlopa idegen kulcs oszlopként, amely megfelel a id
oszlop a users
tábla. Az idegen kulcsok azt mutatják, hogy az RDBMS hogyan hoz létre kapcsolatokat az adatsorok között, akár ugyanabban a táblázatban, akár a táblák között.
a fenti SQL utasításból látható, hogy a kapcsolat létrehozására szolgáló sor
FOREIGN KEY (book_id) REFERENCES books(id) ON DELETE CASCADE
a fenti példában a id
a books
tábla elsődleges kulcsa, amelyet a reviews táblával való kapcsolat létrehozására használnak. A id
adatokat a book_id
mezőben található vélemények táblázat tárolja, hogy a könyveket az értékelésekkel leképezze. A ON DELETE CASCADE
záradék azt jelzi, hogy ha egy könyvet töröl, akkor a könyvhez kapcsolódó összes értékelés is törlődik.
összetett kulcs elsődleges kulcsként
az előző fejezetben létrehoztunk egy sok-sok kapcsolatot, amelyben az elsődleges kulcsunk két oszlopból állt. A user_id
és a book_id
együttesen képezték a kereszthivatkozási táblázat elsődleges kulcsát, amint az az SQL utasítás ezen sorában látható.
PRIMARY KEY (user_id, book_id)
amikor a primary_key egy egyedi párból áll PRIMARY KEY (user_id, book_id)
, összetett kulcsként ismert. Általában sok a sokhoz kapcsolatban fordul elő, és hozzá kell adnunk egy extra táblát a kapcsolati adatok tárolásához. Az összetett kulcs biztosítja, hogy a táblázatban szereplő adatok egyediek legyenek a felhasználó és a könyv közötti kapcsolat szempontjából. Példa:
|User_id | Book_id | | 1 | 1 | | 1 | 2 | | 2 | 1 |
egyedi megszorítások
az elsődleges kulcs mellett az adatbázis lehetővé teszi egyedi korlátozás alkalmazását az adatbázis bármely oszlopára. Például a könyvek táblázatban nemcsak a book_id
értéket választhatjuk egyedi elsődleges kulcsként, hanem a könyv ISBN-számát is tárolnunk kell. Az ISBN, a nemzetközi Standard Könyvszám egy 10 jegyű egyedi szám egy könyv számára. Dönthetünk úgy, hogy megtervezzük adatbázisunkat, hogy ez az oszlop egyedi legyen. Annak ellenére, hogy ez nem elsődleges kulcs, a duplikált ISBN-ek nem engedélyezettek a könyvek táblában, és az adatminőség megmarad.
az egyedi kényszer nem teszi lehetővé az isbn oszlopértékének duplikált bejegyzését a books táblába.
NOT NULL megszorítások
sok SQL utasításunkban láttuk a “NOT NULL” szót. A NOT NULL
kényszer megakadályozza, hogy egy oszlop null értéket engedélyezzen (azaz ennek az oszlopnak adatokat kell tartalmaznia). Ez fontos a kulcsfontosságú területeken. Például: ha felhasználót szeretne hozzáadni egy adatbázishoz, meg kell adnia egy felhasználónevet. E korlátozás nélkül az adatbázis null értékekkel töltődne fel, és kevésbé lenne hasznos.
hogyan kezeli az SQL ezeket a kapcsolatokat?
a PostgreSQL lehetővé teszi a különböző táblák sémái és adatai közötti kapcsolatokat idegen kulcsok és egy JOIN
nevű művelet segítségével. Ahogy a neve is sugallja, a cél az asztalok összekapcsolása. Ezen a mechanizmuson keresztül például megkaphatjuk a fenti áttekintési táblázat szerzőjének teljes részleteit, mivel van egy user_id
mező, amely a user
táblázatra vonatkozik. Íme egy gyors példa:
most, hogy megértjük, hogyan lehet több táblát létrehozni, és milyen szerepet játszanak a kulcsok a kapcsolatok létrehozásában, mélyebben megvizsgáljuk a különböző illesztéseket, és hogyan épülnek fel az SQL lekérdezések ezekkel az illesztésekkel a szükséges adatok több táblából történő lekéréséhez.