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