| | 1 | = Релационен модел = |
| | 2 | |
| | 3 | == Релациски дијаграм == |
| | 4 | |
| | 5 | Дијаграмот е изработен во Visual Paradigm Desktop Edition и го прикажува целосниот релациски модел на базата на податоци за евиденција на избори, со сите 23 табели, атрибути, примарни клучеви, странски клучеви и врски меѓу ентитетите. |
| | 6 | |
| | 7 | [[Image(RelationalModel.svg, 1400px)]] |
| | 8 | |
| | 9 | == Описна документација и аргументација == |
| | 10 | |
| | 11 | === Сегмент: Person → Candidate / Voter === |
| | 12 | |
| | 13 | Person е централна базна табела која ги чува основните персонални податоци: name, surname, date_of_birth, gender. |
| | 14 | |
| | 15 | И Candidate и Voter наследуваат личност преку странски клуч person_id. |
| | 16 | |
| | 17 | Причина за ваквото моделирање: истото лице може да биде гласач во еден изборен циклус, а кандидат во друг. Исто така, кандидатот е граѓанин со право на глас, па еден person_id може истовремено да постои и во Candidate и во Voter табелата. |
| | 18 | |
| | 19 | Со централизирање на личните податоци во Person се избегнува редундантност и се осигурува конзистентност на податоците низ целата база. |
| | 20 | |
| | 21 | === Сегмент: PoliticalParty → PartyLeader === |
| | 22 | |
| | 23 | Лидерот на партијата е издвоен во посебна табела PartyLeader наместо да биде директен атрибут во PoliticalParty. |
| | 24 | |
| | 25 | Причина: лидерот е Person со свои персонални податоци, а лидерството се менува низ времето. |
| | 26 | |
| | 27 | Оваа структура овозможува историско следење на кој бил лидер на која партија и во кој период, без губење на историски записи. |
| | 28 | |
| | 29 | === Сегмент: PoliticalParty → PartyCoalition → CoalitionMember === |
| | 30 | |
| | 31 | Коалициите се моделирани преку посебен ентитет PartyCoalition поврзан со конкретен избор преку election_id. |
| | 32 | |
| | 33 | Членовите на коалицијата се евидентираат преку асоцијативната табела CoalitionMember. |
| | 34 | |
| | 35 | Причина: коалицискиот состав може да се менува меѓу изборни циклуси. |
| | 36 | |
| | 37 | Моделот овозможува прецизно следење кои партии биле дел од коалиција на кои конкретни избори, со можност за историска споредба. |
| | 38 | |
| | 39 | === Сегмент: PoliticalEntity === |
| | 40 | |
| | 41 | PoliticalEntity е генерички ентитет кој унифицирано претставува партија, коалиција или независен кандидат. |
| | 42 | |
| | 43 | Атрибутот type го разликува случајот, додека party_id, coalition_id и candidate_id се nullable во зависност од типот. |
| | 44 | |
| | 45 | Атрибутот is_independent го означува случајот кога кандидатот настапува без партиска припадност. |
| | 46 | |
| | 47 | Причина: табелите VoteResult, Ballot, CandidateList и ElectionParticipant се поврзуваат со еден унифициран ентитет наместо со три различни табели. |
| | 48 | |
| | 49 | Ова ја поедноставува аналитиката и ги намалува JOIN операциите при пребарување. |
| | 50 | |
| | 51 | === Сегмент: Election → ElectionType / WinnerMethod / ElectionCycle === |
| | 52 | |
| | 53 | Изборот е поврзан со три независни lookup табели: |
| | 54 | |
| | 55 | * ElectionType — дефинира тип на избор (парламентарни, претседателски, локални итн.) |
| | 56 | * WinnerMethod — дефинира метод на одредување победник (мнозински, пропорционален итн.) |
| | 57 | * ElectionCycle — овозможува моделирање на повеќе изборни круга во рамките на ист избор |
| | 58 | |
| | 59 | Причина: со издвојување на овие атрибути во посебни табели, моделот станува целосно генеричен. |
| | 60 | |
| | 61 | Истата структура се користи за секаков тип на избори, во која било земја, без потреба од структурни промени во базата. |
| | 62 | |
| | 63 | === Сегмент: Region → RegionType / ElectoralDistrict / PollingStation === |
| | 64 | |
| | 65 | Region е хиерархиски организирана преку self-referencing атрибут parent_region_id, со што се моделираат различни административни нивоа: |
| | 66 | |
| | 67 | * Земја |
| | 68 | * Регион |
| | 69 | * Општина |
| | 70 | * Населено место |
| | 71 | |
| | 72 | RegionType го дефинира нивото на регионот. |
| | 73 | |
| | 74 | ElectoralDistrict го поврзува регионот со конкретен избор и ги чува достапните места (seats_available), а PollingStation ги евидентира физичките гласачки места со адреса и број на регистрирани гласачи. |
| | 75 | |
| | 76 | Причина: хиерархискиот self-referencing дизајн на Region овозможува флексибилна примена за различни државни административни структури без промена на шемата. |
| | 77 | |
| | 78 | === Сегмент: Ballot / VoteResult === |
| | 79 | |
| | 80 | Ballot претставува евиденција на поединечно издадено гласачко ливче — поврзано со избор, гласачко место, политички ентитет и кандидат, со временска ознака (ballot_timestamp) и индикатор за валидност (is_valid). |
| | 81 | |
| | 82 | VoteResult претставува збирен резултат по гласачко место и политички ентитет, со вкупен број гласови (votes). |
| | 83 | |
| | 84 | Причина за раздвојувањето: Ballot овозможува детална ревизија и верификација на секое ливче, додека VoteResult овозможува брза аналитика и генерирање на резултати без процесирање на секој индивидуален запис. |
| | 85 | |
| | 86 | Клучно е да се напомене дека Ballot намерно не е поврзан со Person, со што тајноста на гласањето е загарантирана на ниво на дизајн на базата. |
| | 87 | |
| | 88 | === Сегмент: CandidateList / CandidateListItem === |
| | 89 | |
| | 90 | CandidateList ја поврзува листата на кандидати со конкретен избор и политички ентитет. |
| | 91 | |
| | 92 | CandidateListItem го евидентира секој кандидат на листата со неговата позиција (position). |
| | 93 | |
| | 94 | Причина: редоследот на кандидатите на изборна листа е правно релевантен при пропорционален систем на гласање. |
| | 95 | |
| | 96 | Со атрибутот position се овозможува прецизна евиденција на редоследот, а структурата поддржува листи со произволен број кандидати. |
| | 97 | |
| | 98 | === Сегмент: StationElection / ElectionParticipant === |
| | 99 | |
| | 100 | StationElection е асоцијативна табела која поврзува гласачко место со конкретен избор, бидејќи едно гласачко место може да биде активно на повеќе различни избори. |
| | 101 | |
| | 102 | ElectionParticipant ги евидентира политичките ентитети кои учествуваат во конкретна изборна единица (district_id), овозможувајќи прецизен приказ кој учесник настапил во кој дел на земјата. |