Warning: Creating default object from empty value in /chroot/home/zerotohe/zerotohero.hu/html/wp-content/themes/salient/nectar/redux-framework/ReduxCore/inc/class.redux_filesystem.php on line 29
Névkonvenciók DB-ben | zeroToHero

Névkonvenciók DB-ben

Érkezett hozzánk egy olyan kérdés, hogy milyen elnevezési konvenciók léteznek az adatbázisokban. Válaszul az SQL-t és a PL/SQL-t fogjuk közelebbről megvizsgálni, részben Oracle szemüvegen át.

SQL

Kezdjük a kis- és nagybetűkkel meg az idézőjelekkel. Az SQL nyelv alapvetően case-insensitive, tehát nem számít a kis- és nagybetűk különbsége. Ez igaz a nyelv kulcsszavaira vagy más néven fenntartott szavaira, valamint az azonosítókra, viszont nem igaz az egyszeres idézőjelbe (aposztrófok közé) tett szöveges konstansokra vagy más néven szöveges literálokra, illetve a dupla idézőjelbe (macskakörmök közé) tett azonosítókra sem.

Vegyük sorra a fentieket. Nézzünk egy példát:


SELECT emp.first_name, emp.last_name, emp.email
FROM hr.all_employees emp
WHERE last_name='Smith'
ORDER BY first_name DESC;

Kulcsszavak

Példánkban a kulcsszavak a következők: SELECT, FROM, WHERE, ORDER BY, DESC. A kulcsszavakat lehetne kisbetűvel is írni (select, from stb.) sőt akár nagy kezdőbetűvel (Select, From stb.) . Ízlés kérdése. Ha az ember gyorsan összedob egy lekérdezést, általában mindent kisbetűvel ír benne. A csupa nagybetűs írásmód egy kissé ódonnak hathat, de egyben tekintélyt parancsoló is: mintegy jelzi, hogy ezek a szavak érinthetetlenek. Hátrány, hogy más nyelvekben a konstansokat szokás nagybetűsíteni, ez esetleg zavaró lehet. Továbbá nagybetűkkel írni kényelmetlenebb – hacsak nem egy fejlesztőkörnyezet formázó modulja alakítja át a lekérdezéseinket ilyenre. Mindenesetre a nagybetűk jól kiemelik a fenntartott szavakat, így a megfelelő tördelés mellett érdemes lehet ezt a megoldást választani, főleg hosszabb lekérdezések esetén.

Azonosítók

Fenti példánkban az azonosítók a következők: first_name, last_name, email, phone – ezek oszlopnevek, hr – ez egy adatbázis-felhasználó neve, all_employees – ez egy táblanév, illetve  emp – ez pedig egy alias a hr tulajdonában álló all_employees táblára. Az azonosítók általában felhasználó által definiált nevek (hacsak nem beépített táblából kérdezünk le, lásd lejjebb). Az azonosítóknál sem számít a kis- és nagybetűk különbsége, szintén ízlés kérdése, hogy hogyan írjuk őket. A kisbetűs írás javasolt, különösen ha a kulcsszavak nagybetűsek, ekkor ugyanis jól elkülönül egymástól a kettő.

Az azonosítókat dupla idézőjelek közé is tehetjük (pl. „all_employees.last_name”), ekkor azonban case-sensitive névvé válnak, nem lesz mindegy a kis- és nagybetű. Dupla idézőjelek között kulcsszó is szerepelhet azonosítóként (pl. „order”), de remélhetőleg ilyen senkinek sem jut eszébe. Nagy hátrány, hogy ha egy azonosítót dupla idézőjelek között adtunk meg (pl. CREATE TABLE „Params” (key NUMBER, value NUMBER)), akkor később is csak idézőjelek között hivatkozhatunk rá, és csakis ugyanúgy, ahogy eredetileg írtuk. Összességében nem javasolt a dupla idézőjeles megoldás, hiszen csak bonyolítja az életünket. Használjunk egyszerű azonosítókat, amelyek nem igénylik az idézőjelet.

Oracle adatbázisokban az azonosítók hossza nem haladhatja meg a 30 bájtot. Hogy ez mennyi karakter, az az adatbázis karakterkódolásától függ. Egy 8 bites karakterkódolás esetén ez 30 karaktert jelent. Íme egy 30 karakter hosszú név: quoted_user_defined_identifier. Nem is tűnik annyinak, ugye? Elég szigorú ez a korlát. Jó tanács, hogy törekedjünk a rövid, de azért kifejező azonosítók használatára.

Szöveges literálok

A szöveges literálok csak lazábban kapcsolódnak ide, mégis fontos említést tenni róluk. Amit aposztrófok közé írunk, azt szó szerint (literally) kell érteni, tehát nyilván lényeges a nagybetűk–kisbetűk különbsége. Fenti példánkban az egyetlen szöveges literál a ‘Smith‘. Egy adatbázistábla VARCHAR2 típusú oszlopában ilyen literálok tárolódnak.

Tegyünk most megint egy Oracle-specifikus kitérőt, rövid látogatást az adatszótár bugyraiba. Az adatszótár olyan belső táblák sokasága, ahol az Oracle adatbázis a metaadatatokat tárolja, például a táblák tulajdonosát, nevét, oszlopait és rengeteg egyéb adatot. Az Oracle DBA-k gyakran kérdeznek le az adatszótárból. Noha  a tulajdonosok, táblák, oszlopok stb. neve azonosítók lévén case-insensitive, az adatszótárban mégis nagybetűsítve tárolódnak. Ha tehát szeretnénk lekérdezni a hr.employees tábla metaadatait, akkor nagybetűket kell használnunk, valahogy így:


SELECT * FROM dba_tables
WHERE owner='HR' AND table_name='EMPLOYEES'

 

Ha nem így teszünk, akkor kellemetlen percek következhetnek, például arra a téves következtetésre juthatunk, hogy nincs is ilyen nevű tábla. Erre érdemes figyelni.

A szimpla és dupla idézőjeleket tehát nem szabad összekeverni. Az előbbi literálokhoz kötelező, az utóbbi azonosítókhoz használható, de rossz gyakorlat.

Adatbázis-objektumok elnevezése

Mielőtt áttérnénk a PL/SQL-re, álljon itt néhány további hasznos tipp az adatbázis objektumainak elnevezéséhez. Az előző példákból az is látható, hogy táblanevekben, de az oszlopnevekben, felhasználónevekben stb. is általában alulvonás választja el egymástól a szavakat. Legalábbis ez a leggyakoribb, jóllehet az SQL alapvetően case-insensitive, ami lehetővé tenné például a a CamelCase megoldást is. A táblák neve általában többes számú (pl. employees), hiszen szinte mindig több mint egy sort tartalmaz. Az egyedi azonosító oszlop neve viszont egyes számú szokott lenni, _id utótaggal, pl.: employee_id. A külső kulcsok (foreign key) nevébe bele szoktuk írni a hivatkozott  tábla nevét és oszlopát, illetve egy _fk utótagot. Az indexek nevébe pedig érdemes belefoglalni az oszlop(ok) nevét és egy _idx utótagot. Sorolhatnánk még, de ezek inkább amolyan irányelvek. Helyette nézzük most meg röviden a tárolt eljárásokat.

PL/SQL

A PL/SQL az SQL nyelv procedurális kiterjesztése az Oracle-ben. (Más adatbázis-kezelőkben is vannak hasonló nyelvek, pl. a PostgreSQL-ben a PL/pgSQL.) Egy fórumon valaki azt mondta egyszer, hogy a  PL/SQL-t úgy kell elképzelni, mint a COBOL (a legelső programozási nyelvek egyike) és az SQL szentségtelen unióját. Valóban érezhető a nyelv régies jellege, és a csupa nagybetűk ezt csak tovább erősítik. Ám ami még ennél is sokkal borzasztóbb, hogy a PL/SQL valójában ugyanúgy case-insensitive, mint az SQL, és ezzel valamilyen érthetetlen okból sokan visszaélnek: keverik a nagybetűket a kisbetűkkel, a nagy kezdőbetűket az alulvonásokkal stb. Íme egy példa az Oracle hivatalos dokumentációjából:


DECLARE
  "HELLO" varchar2(10) := 'hello';
BEGIN
   DBMS_Output.Put_Line(Hello);
END;

 

A példa azt mutatja, hogy a deklarációs részben dupla idézőjelek között is megadhatjuk a változó nevét („HELLO”). De miért tennénk ilyet? Továbbá mivel idézőjelek nélkül is egy érvényes azonosítóról van szó, később egy függvény paramétereként idézőjelek nélkül is leírhatjuk, ráadásul nagy kezdőbetűvel (Hello). Itt már ugye mindenki ráncolja a homlokát? Végül látszik még az is, hogy a DBMS_OUTPUT beépített programcsomag és az abban lévő PUT_LINE függvény nevét annyira összekuszálhatjuk, amennyire nem szégyelljük. Ez a példa tehát egy sor olyan megoldást mutat be, amit messzire érdemes kerülnünk. No persze ez is ízlés dolga, de azért mindennek van határa. Mi inkább valami ilyesmit javasolnánk:


DECLARE
  v_hello VARCHAR2(10) := 'hello';
BEGIN
  DBMS_OUTPUT.PUT_LINE(v_hello);
END;

 

Tehát a kulcsszavakat (az adattípusok is ide tartoznak) írjuk csupa nagybetűkkel, a változóneveket kisbetűkkel. A modernebb kinézet hívei meg írhatnak akár mindent kicsivel. Jó gyakorlat, ha a név előtagjába belekódoljuk, hogy milyen jellegű dolgot takar: v_ mint változó, p_  mint (formális) paraméter, t_  mint típus stb. Ezt egyébként Simonyi nyomán magyar jelölésnek (Hungarian notation) nevezik, így akár még büszkén mutogathatjuk külföldi kollégáinknak is.

Zárásképpen annyit, hogy kőbe vésett szabályok természetesen nincsenek. A legfontosabb talán az, hogy alakítsunk ki magunknak egy számunkra logikus szabályrendszert az elnevezésekhez, aztán pedig következetesen tartsuk is magunkat ehhez. És persze használjunk tömör, de beszédes neveket.

Jó kódolást!