Садржај
3.0 SQL: Промена садржаја базе
3.2 SQL: Ажурирање података у табелама
3.3 SQL: Брисање података из табела
7.0 Библиотека Flask - пројектни задатак

Табеларна организација података

Најраспрострањенији модел представљања података у базама је релациони модел, који подразумева да су сви подаци записани у табелама. Прецизније речено, ми у оквиру овог модела податке замишљамо као табелиране и у складу са тиме осмишљавамо рад са подацима, док интерна репрезентација података може да буде знатно сложенија, услед различитих оптимизација.

🤓 Зашто се овај модел зове релациони?

Релација у математици се дефинише као скуп уређених н-торки. На пример, релација „бити дељив” на скупу {2, 3, 4, 5, 6} може да се представи као скуп уређених парова {(4, 2), (6, 2), (6, 3)}.

Када н-торке које чине релацију запишемо једну испод друге, добијамо табелу. Редовима табеле одговарају н-торке које су у релацији. Стога се у базама података термини табела и релација често користе као синоними.

дељеник

делилац

4

2

6

2

6

3

Јаку математичку основу савремених релационих база података поставио је Едгар Код (енгл. Edgar Codd) почетком 1970-их, кроз два формализма позната као релациона алгебра и релациони рачун.

Табеле имају своје ћелије, организоване у хоризонталне врсте (редове) и вертикалне колоне.

У примерима у овом поглављу бавићемо се базом у којој се чувају подаци карактеристични за електронскои дневник једне средње школе, у нешто поједноставњеној верзији. На пример, наредна табела садржи податке о ученицима једне школе:

id

ime

prezime

pol

datum_rodjenja

razred

odeljenje

1

Петар

Петровић

м

2006-07-01

1

1

2

Милица

Јовановић

ж

2006-04-03

1

1

3

Лидија

Петровић

ж

2006-12-14

1

1

4

Петар

Миловановић

м

2005-12-08

2

1

Помоћу три тачкице наглашаваћемо да у табели постоји још података који овде нису приказани.

Примећујемо да су појединачни ученици смештени по врстама, док свака колона садржи неки посебан податак о ученицима:

  • прва колона id садржи редни број ученика у табели,

  • друга колона ime садржи име,

  • трећа колона prezime садржи презиме,

  • четврта колона pol садржи пол,

  • пета колона datum_rodjenja садржи датум рођења,

  • шеста колона razred садржи разред у који ученик иде и

  • седма колона odeljenje садржи одељење ком ученик припада.

Оваква организација је карактеристична за све табеле у базама података — по врстама се складиште посебни ентитети (јединке, објекти), док се по колонама складиште њихови атрибути (својства, карактеристике).

Свака табела је одређена списком колона (атрибута) и типовима података који се њима представљају. У претходном примеру редни број, разред и одељење су цели (природни) бројеви, име и презиме су текстуални подаци (ниске карактера), док је датум рођења податак специјалног типа датум.

Свака ћелија садржи највише један податак (кажемо да су ћелије атомичне) или је евентуално празна (садржи специјалну недостајућу вредност коју означавамо са NULL), што нећемо често користити у примерима. У чистом релационом моделу ћелија не садржи више података (низ података, скуп података и слично). Пожељно је да подаци у свакој ћелији буду заокружене, недељиве целине. На пример, уместо да име и презиме ученика сместимо у једну колону, боље је да имамо засебне колоне за име и презиме, јер је сасвим могуће да ће се неки упити односити засебно на имена или на презимена ученика.

Примарни кључ

Карактеристично за релациони модел је да врсте у табели немају дефинисан физички положај унутар табеле. Ако смо, на пример, уписали три врсте у табелу која је претходно била празна не можемо рећи која ће врста бити прва, која друга, а која трећа. Једини начин да изаберемо одређену врсту је према вредностима њених атрибута.

Ако нам треба да знамо редни број врсте онда морамо да уведемо колону за редни број, као што смо то учинили у претходном примеру и да онда ми сами (непосредно или кроз апликацију коју правимо) водимо рачуна о томе како ћемо уписивати редне бројеве.

Генерално нам у пракси за сваку табелу треба једна колона или група колона преко којих можемо једнозначно да одређујемо поједине врсте у табели.

Могло би се можда помислити да су у табели ученика име и презиме ученика такви подаци, међутим, то није случај, јер је сасвим могуће да два ученика чак и у истом одељењу имају исто име и презиме. Свака особа у Србији се једнозначно може идентификовати својим јединственим матичним бројем грађана и додавање ЈМБГ у нашу табелу ученика би нам омогућило њихово једнозначно идентификовање на основу ЈМБГ. Међутим, могуће је да не знамо ЈМБГ свих ученика или да не желимо да такве личне податке чувамо у нашој бази. Стога је у приказаној табели ученика уведена прва колона у којој се чува редни број ученика. Пошто ћемо ми сами (тј. наша апликација) да додељујемо редни број, водићемо рачуна да се не понавља, тако да може да се користи као јединствени идентификатор ученика у оквиру базе. На пример, када се помене „ученик број 4”, јасно је да се ради о Петру Миловановићу, мушког пола, који је рођен 8. децембра 2005. године и који иде у друго један одељење.

Због што ефикаснијег извршавања упита је важно да СУБП може веома брзо да нађе у табели ред који му је потребан. Да бисмо омогућили брзо проналажење редова, потребно је да се одреди једна или више колона (података) који својим садржајем једнозначно идентификују врсту у табели. Таква колона или група колона се назива примарни кључ те табеле.

Група свих колона једне табеле увек може увек да се употреби за једнозначно идентификовање сваке врсте у табели, тј. може да се прогласи да примарни кључ чине све колоне. Међутим, то најчешће није практично јер непотребне колоне у примарном кључу само оптерећују рад са табелом. У пракси се увек тежи да примарни кључ чини што мањи број колона, а најчешће је то једна колона.

Примарни кључ може да буде неко познато својство ентитета које је јединствено. На пример, у табели која садржи називе општина у Србији и њихов број становника, назив општине може бити примарни кључ, јер не постоје две општине које се исто зову.

opstina

broj_stanovnika

Барајево

26673

Бачка Топола

36213

Вождовац

162749

Врачар

56380

У табели која садржи називе америчких градова, државе у којима се налазе и њихов број становника, примарни кључ може бити пар који чине назив града и назив државе. Наиме, назив града није довољан, јер је могуће да постоје два града у две различите државе који се исто називају (нпр. у чак 34 америчке државе постоји град који се зове Springfield).

grad

drzava

broj_stanovnika

Springfield

Illinois

115888

Springfield

Misouri

462369

Chicago

Illinois

2713452

Некада су подаци који се намећу као примарни кључеви одређени националним или међунарнодним стандардима. На пример, за идентификовање особа у Србији користи се ЈМБГ, док се у Америци користи тзв. SSN (social security number). За идентификовање места у САД користи се ZIP код. За идентификовање књига користи се међународни ISBN.

Поред тога што неко познато својство можемо да користимо као примарни кључ, можемо и да уведемо посебан јединственим број који наша апликација или сама база података додељује приликом уписа нове врсте у табелу. То зовемо генерисан примарни кључ и уобичајено је да таква колона носи назив id.

И пре појаве рачунара је постојала пракса да се приликом уписа у евиденцију додељује број под којим је нешто уписано. У папирним књигама у којима се воде евиденције често се налазе табеле у којима је једна од колона „број уписа” или „редни број”.

Све у свему, два основна начина за избор примарног кључа су:

  • постојећи податак који се уноси у табелу, а знамо да мора бити јединствен

  • податак који се генерише приликом уписа врсте у табелу

За разлику од коришћења постојећих података за примарне кључеве (ЈМБГ, SSN, ZIP код, ISBN), генерисани кључеви су тесно везани за нашу базу података и немају друго значење.

За разлику од папирних евиденција, генерисане кључеве обично зовемо идентификатори, а не редни бројеви, јер желимо да истакнемо само да је кључ јединствен и да код коришћења података не треба рачунати на то како је кључ генерисан.

Приликом дефинисања (формирања) табела у бази унутар СУБП, важно је нагласити које колоне чине примарни кључ. Користећи ове информације, СУБП интерно организује податке на такав начин да може много брже да приступи подацима на основу вредности примарног кључа, него када није наглашено које колоне чине примарни кључ (уз нека додатна подешавања, СУБП може брзо да присупа подацима и по садржају колона које нису кључне).

Када задамо примарни кључ, систем осим бржег приступа подацима аутоматски обезбеђује да у табелу није могуће грешком унети две врсте које би имале исту вредност примарног кључа.

Индекси

Претрага табеле се најчешће врши преко примарног кључа. Међутим, некада се може очекивати да ће се претрага често вршити и на основу неке друге колоне. На пример, у електронском дневнику се може очекивати да ће се ученици претраживати и на основу имена и презимена. Да би се убрзала претрага по некој колони табеле која није примарни кључ, могуће је тој колони придружити индекс. Индекс је помоћна структура података која може драстично да убрза претрагу. Са друге стране, индекси могу мало да успоре додавање нових врста и ажурирање постојећих, па се стога индекси не додају аутоматски за све колоне, већ само за примарни кључ. За остале колоне дизајнер базе може ручно да дода индекс ако процењује да ће претртага бити често вршена по вредностима тих колона.

🤓 Како функционишу индекси?

Индекси се користе и ван база података. На пример, на крају неких стручних књига налази се индекс који сваком важном појму који се у књизи јавља придружује списак страница књиге на којима се тај појам појављује. При томе је списак појмова сортиран, тако да појам који тражимо може брзо и лако да се пронађе. Да нема индекса, читалац би морао да пажљиво проучи све странице књиге (којих обично има неколико стотина) да би пронашао појам који тражи. И телефонски именик неког града је пример индекса. Дакле, додавањем индекса књизи, аутор помаже читаоцу да убрза претрагу неког појма и до неколико стотина пута.

Слично томе, индекси у базама података се организују тако да се у додатним структурама података (индекс у књизи је такође засебан додатак у оквиру књиге) подаци организују на начин да се претрага по неком својству може извести јако брзо. На пример, ако би се у табели ученика направио индекс који пописује имена и презимена ученика и сваком имену и презимену придружује низ врста табеле које садрже то име и презиме, при чему је списак имена и презимена дат тако да се може брзо претраживати (на пример, тако што би се чувао у неком облику сортираног редоследа), претрага табеле на основу имена и презимена би постала неупоредиво бржа него када тог индекса нема (ако индекса нема, СУБП мора да анализира буквално све врсте табеле, проверавајући да ли оне садрже тражено име и презиме).

(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+