= Релационен модел == ЕР Дијаграм [[Image(RelationalModel-arena_pvp.svg​)]] == Дополнителен Опис === Mодел на пријателства (friendships) Пријателството е моделирано како една релација помеѓу два корисници, при што секогаш се чуваат како `user_id_low` и `user_id_high` со услов првиот да е помал. Ова спречува дупликати како (A,B) и (B,A). Полето `requested_by_user_id` покажува кој ја испратил поканата, а `status` ја следи состојбата (pending, accepted, blocked). === Mодел на натпревари (matches, match_teams, match_participants) Натпреварот е поделен на три дела: сам натпревар, тимови во натпреварот и играчи во тие тимови. Ова овозможува јасна структура: натпревар -> тимови -> играчи. Со надворешен клуч се осигурува дека играч може да припаѓа само на тим кој е дел од конкретниот натпревар. Овој пристап е флексибилен и поддржува различни типови игри. === Преференци и нотификации Преференците чуваат кои игри му се омилени на корисникот, а нотификациите можат да се поврзат со тие преференци. Така системот може да испраќа известувања поврзани со интересите на корисникот, на пример за нов турнир во омилена игра. === Many-to-many релации (game_genres, game_developers) Овие релации се решени со помошни (junction) табели со составен примарен клуч. Ова значи дека една игра може да има повеќе жанрови, а еден жанр може да припаѓа на повеќе игри. === Членство во тим (team_memberships) Членството е моделирано како посебна табела затоа што не е само врска, туку има дополнителни информации како улога (капетан, член, тренер) и статус. Така може да се следи кој корисник во кој тим е и каква улога има. === Претплати и плаќања (subscriptions, payments) Се чуваат информации за претплатите и нивните периоди, а плаќањата се поврзани со нив. Со посебен услов се осигурува дека еден корисник може да има само една активна претплата. === Постигнувања (user_achievements) Оваа табела покажува кои корисници кои постигнувања ги отклучиле и кога. Така може да се следи напредокот на корисниците и да се прават статистики. === Сервери и локации Локацијата е одделена во посебна табела, а серверите се поврзани со неа. Ова избегнува дуплирање на податоци и овозможува повеќе сервери да користат иста локација. === Систем за статистики (stat_types, participant_stats) Статистиките се моделирани на флексибилен начин преку две табели. Во `stat_types` се дефинираат типовите на статистики за секоја игра (на пример: kills, assists, deaths, headshots), додека во `participant_stats` се чуваат конкретните вредности за секој играч во одреден натпревар. Ова значи дека за еден играч во еден натпревар може да има повеќе записи – по еден за секој тип на статистика. Овој пристап е избран затоа што различни игри имаат различни метрики, па не е практично да се прават фиксни колони (на пример kills, assists, итн.) за сите игри. Наместо тоа, моделот овозможува лесно додавање нови типови статистики без промена на структурата на базата. Со тоа системот станува многу пофлексибилен и проширлив. Дополнително, овој дизајн е погоден за интеграција со надворешни сервиси, како на пример FACEIT API. Бидејќи FACEIT API враќа статистики во динамичен формат (различни игри, различни полиња), овие податоци можат директно да се мапираат во `stat_types` и `participant_stats` без потреба од промена на базата. Ова овозможува системот автоматски да увезува и чува реални статистики од натпревари, што ја зголемува точноста и функционалноста на апликацијата.ункционалноста на апликацијата.