Changes between Version 5 and Version 6 of RelationalModel


Ignore:
Timestamp:
04/22/26 18:13:22 (10 days ago)
Author:
231071
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • RelationalModel

    v5 v6  
    11= Релационен модел =
    22
    3 == Релациски дијаграм ==
     3== ER дијаграм ==
    44
    5 Дијаграмот е изработен во Visual Paradigm Desktop Edition и го прикажува целосниот релациски модел на базата на податоци за евиденција на избори, со сите 23 табели, атрибути, примарни клучеви, странски клучеви и врски меѓу ентитетите.
    6 
    7 [[Image(EDB.svg, 1200px )]]
     5[[Image(EDB.svg, 1200px)]]
    86
    97== Описна документација и аргументација ==
    108
    11 === Сегмент: Person → Candidate / Voter ===
     9=== Сегмент: `Person` → `Candidate` / `Voter` ===
    1210
    13 Person е централна базна табела која ги чува основните персонални податоци: name, surname, date_of_birth, gender.
     11`Person` е централна базна табела која ги чува основните персонални податоци: `name`, `surname`, `date_of_birth`, `gender`.
    1412
    15 И Candidate и Voter наследуваат личност преку странски клуч person_id.
     13И `Candidate` и `Voter` наследуваат личност преку странски клуч `person_id`.
    1614
    17 Причина за ваквото моделирање: истото лице може да биде гласач во еден изборен циклус, а кандидат во друг. Исто така, кандидатот е граѓанин со право на глас, па еден person_id може истовремено да постои и во Candidate и во Voter табелата.
     15Причина за ваквото моделирање: истото лице може да биде гласач во еден изборен циклус, а кандидат во друг. Исто така, кандидатот е граѓанин со право на глас, па еден `person_id` може истовремено да постои и во `Candidate` и во `Voter` табелата.
    1816
    19 Со централизирање на личните податоци во Person се избегнува редундантност и се осигурува конзистентност на податоците низ целата база.
     17Со централизирање на личните податоци во `Person` се избегнува редундантност и се осигурува конзистентност на податоците низ целата база.
    2018
    21 === Сегмент: PoliticalParty → PartyLeader ===
     19=== Сегмент: `PoliticalParty` → `PartyLeader` ===
    2220
    23 Лидерот на партијата е издвоен во посебна табела PartyLeader наместо да биде директен атрибут во PoliticalParty.
     21Лидерот на партијата е издвоен во посебна табела `PartyLeader` наместо да биде директен атрибут во `PoliticalParty`.
    2422
    25 Причина: лидерот е Person со свои персонални податоци, а лидерството се менува низ времето.
     23Причина: лидерот е `Person` со свои персонални податоци, а лидерството се менува низ времето.
    2624
    2725Оваа структура овозможува историско следење на кој бил лидер на која партија и во кој период, без губење на историски записи.
    2826
    29 === Сегмент: PoliticalParty → PartyCoalition → CoalitionMember ===
     27=== Сегмент: `PoliticalParty` → `PartyCoalition` → `CoalitionMember` ===
    3028
    31 Коалициите се моделирани преку посебен ентитет PartyCoalition поврзан со конкретен избор преку election_id.
     29Коалициите се моделирани преку посебен ентитет `PartyCoalition` поврзан со конкретен избор преку `election_id`.
    3230
    33 Членовите на коалицијата се евидентираат преку асоцијативната табела CoalitionMember.
     31Членовите на коалицијата се евидентираат преку асоцијативната табела `CoalitionMember`.
    3432
    3533Причина: коалицискиот состав може да се менува меѓу изборни циклуси.
     
    3735Моделот овозможува прецизно следење кои партии биле дел од коалиција на кои конкретни избори, со можност за историска споредба.
    3836
    39 === Сегмент: PoliticalEntity ===
     37=== Сегмент: `PoliticalEntity` ===
    4038
    41 PoliticalEntity е генерички ентитет кој унифицирано претставува партија, коалиција или независен кандидат.
     39`PoliticalEntity` е генерички ентитет кој унифицирано претставува партија, коалиција или независен кандидат.
    4240
    43 Атрибутот type го разликува случајот, додека party_id, coalition_id и candidate_id се nullable во зависност од типот.
     41Атрибутот `type` го разликува случајот, додека `party_id`, `coalition_id` и `candidate_id` се nullable во зависност од типот.
    4442
    45 Атрибутот is_independent го означува случајот кога кандидатот настапува без партиска припадност.
     43Атрибутот `is_independent` го означува случајот кога кандидатот настапува без партиска припадност.
    4644
    47 Причина: табелите VoteResult, Ballot, CandidateList и ElectionParticipant се поврзуваат со еден унифициран ентитет наместо со три различни табели.
     45Причина: табелите `VoteResult`, `Ballot`, `CandidateList` и `ElectionParticipant` се поврзуваат со еден унифициран ентитет наместо со три различни табели.
    4846
    4947Ова ја поедноставува аналитиката и ги намалува JOIN операциите при пребарување.
    5048
    51 === Сегмент: Election → ElectionType / WinnerMethod / ElectionCycle ===
     49=== Сегмент: `Election` → `ElectionType` / `WinnerMethod` / `ElectionCycle` ===
    5250
    5351Изборот е поврзан со три независни lookup табели:
    5452
    55  * ElectionType — дефинира тип на избор (парламентарни, претседателски, локални итн.)
    56  * WinnerMethod — дефинира метод на одредување победник (мнозински, пропорционален итн.)
    57  * ElectionCycle — овозможува моделирање на повеќе изборни круга во рамките на ист избор
     53 * `ElectionType` — дефинира тип на избор (парламентарни, претседателски, локални итн.)
     54 * `WinnerMethod` — дефинира метод на одредување победник (мнозински, пропорционален итн.)
     55 * `ElectionCycle` — овозможува моделирање на повеќе изборни круга во рамките на ист избор
    5856
    5957Причина: со издвојување на овие атрибути во посебни табели, моделот станува целосно генеричен.
     
    6159Истата структура се користи за секаков тип на избори, во која било земја, без потреба од структурни промени во базата.
    6260
    63 === Сегмент: Region → RegionType / ElectoralDistrict / PollingStation ===
     61=== Сегмент: `Region` → `RegionType` / `ElectoralDistrict` / `PollingStation` ===
    6462
    65 Region е хиерархиски организирана преку self-referencing атрибут parent_region_id, со што се моделираат различни административни нивоа:
     63`Region` е хиерархиски организирана преку self-referencing атрибут `parent_region_id`, со што се моделираат различни административни нивоа:
    6664
    6765 * Земја
     
    7068 * Населено место
    7169
    72 RegionType го дефинира нивото на регионот.
     70`RegionType` го дефинира нивото на регионот.
    7371
    74 ElectoralDistrict го поврзува регионот со конкретен избор и ги чува достапните места (seats_available), а PollingStation ги евидентира физичките гласачки места со адреса и број на регистрирани гласачи.
     72`ElectoralDistrict` го поврзува регионот со конкретен избор и ги чува достапните места (`seats_available`), а `PollingStation` ги евидентира физичките гласачки места со адреса и број на регистрирани гласачи.
    7573
    76 Причина: хиерархискиот self-referencing дизајн на Region овозможува флексибилна примена за различни државни административни структури без промена на шемата.
     74Причина: хиерархискиот self-referencing дизајн на `Region` овозможува флексибилна примена за различни државни административни структури без промена на шемата.
    7775
    78 === Сегмент: Ballot / VoteResult ===
     76=== Сегмент: `Ballot` / `VoteResult` ===
    7977
    80 Ballot претставува евиденција на поединечно издадено гласачко ливче — поврзано со избор, гласачко место, политички ентитет и кандидат, со временска ознака (ballot_timestamp) и индикатор за валидност (is_valid).
     78`Ballot` претставува евиденција на поединечно издадено гласачко ливче — поврзано со избор, гласачко место, политички ентитет и кандидат, со временска ознака (`ballot_timestamp`) и индикатор за валидност (`is_valid`).
    8179
    82 VoteResult претставува збирен резултат по гласачко место и политички ентитет, со вкупен број гласови (votes).
     80`VoteResult` претставува збирен резултат по гласачко место и политички ентитет, со вкупен број гласови (`votes`).
    8381
    84 Причина за раздвојувањето: Ballot овозможува детална ревизија и верификација на секое ливче, додека VoteResult овозможува брза аналитика и генерирање на резултати без процесирање на секој индивидуален запис.
     82Причина за раздвојувањето: `Ballot` овозможува детална ревизија и верификација на секое ливче, додека `VoteResult` овозможува брза аналитика и генерирање на резултати без процесирање на секој индивидуален запис.
    8583
    86 Клучно е да се напомене дека Ballot намерно не е поврзан со Person, со што тајноста на гласањето е загарантирана на ниво на дизајн на базата.
     84Клучно е да се напомене дека `Ballot` намерно не е поврзан со `Person`, со што тајноста на гласањето е загарантирана на ниво на дизајн на базата.
    8785
    88 === Сегмент: CandidateList / CandidateListItem ===
     86=== Сегмент: `CandidateList` / `CandidateListItem` ===
    8987
    90 CandidateList ја поврзува листата на кандидати со конкретен избор и политички ентитет.
     88`CandidateList` ја поврзува листата на кандидати со конкретен избор и политички ентитет.
    9189
    92 CandidateListItem го евидентира секој кандидат на листата со неговата позиција (position).
     90`CandidateListItem` го евидентира секој кандидат на листата со неговата позиција (`position`).
    9391
    9492Причина: редоследот на кандидатите на изборна листа е правно релевантен при пропорционален систем на гласање.
    9593
    96 Со атрибутот position се овозможува прецизна евиденција на редоследот, а структурата поддржува листи со произволен број кандидати.
     94Со атрибутот `position` се овозможува прецизна евиденција на редоследот, а структурата поддржува листи со произволен број кандидати.
    9795
    98 === Сегмент: StationElection / ElectionParticipant ===
     96=== Сегмент: `StationElection` / `ElectionParticipant` ===
    9997
    100 StationElection е асоцијативна табела која поврзува гласачко место со конкретен избор, бидејќи едно гласачко место може да биде активно на повеќе различни избори.
     98`StationElection` е асоцијативна табела која поврзува гласачко место со конкретен избор, бидејќи едно гласачко место може да биде активно на повеќе различни избори.
    10199
    102 ElectionParticipant ги евидентира политичките ентитети кои учествуваат во конкретна изборна единица (district_id), овозможувајќи прецизен приказ кој учесник настапил во кој дел на земјата.
     100`ElectionParticipant` ги евидентира политичките ентитети кои учествуваат во конкретна изборна единица (`district_id`), овозможувајќи прецизен приказ кој учесник настапил во кој дел на земјата.