Changes between Version 2 and Version 3 of ERModel
- Timestamp:
- 09/18/26 21:25:10 (12 days ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
ERModel
v2 v3 1 = Entity-Relationship Modelv.01 =1 = Ентитетско-релационен модел v.01 = 2 2 3 == Diagram==3 == Дијаграм == 4 4 5 5 [[Image(ERModel_v01.png, width=100%)]] 6 6 7 Source file: [attachment:ERModel_v01.xml]7 Изворна датотека: [attachment:ERModel_v01.xml] 8 8 9 == Data requirements==9 == Барања за податоци == 10 10 11 === Entities===11 === Ентитети === 12 12 13 13 ==== Admins ==== 14 Represents the administrators of the system. Administrators have full control over the application: they manage user accounts, configure the categories of problems and assign reports to municipal workers. They are modeled as a separate entity set because they take part in different relationships (Manages, Assigns) than the other types of users.14 Ги претставува администраторите на системот. Администраторите имаат целосна контрола врз апликацијата: управуваат со корисничките сметки, ги конфигурираат категориите на проблеми и ги доделуваат пријавите на општинските работници. Моделирани се како посебно множество ентитети бидејќи учествуваат во различни релации (Manages, Assigns) од другите типови корисници. 15 15 16 ''' Candidate keys:''' admin_id and email. email is unique for every administrator, but it can change over time, so the generated numeric identifier admin_id is chosen as the primary key because it is stable and shorter.16 '''Кандидат клучеви:''' admin_id и email. Е-поштата е единствена за секој администратор, но може да се промени со текот на времето, па затоа за примарен клуч е избран генерираниот нумерички идентификатор admin_id, кој е стабилен и пократок. 17 17 18 ''' Attributes:'''19 * admin_id - numeric, required, auto-generated20 * full_name - text, required, up to 100 characters21 * email - text, required, unique, valid e-mail format22 * password - text, required, stored as a hash, never as plain text18 '''Атрибути:''' 19 * admin_id - нумерички, задолжителен, автоматски генериран 20 * full_name - текст, задолжителен, до 100 знаци 21 * email - текст, задолжителен, единствен, валиден формат на е-пошта 22 * password - текст, задолжителен, се чува како хаш, никогаш како обичен текст 23 23 24 24 ==== Workers ==== 25 Represents the municipal workers who process the reports. Workers receive assignments, update the status of reports and write comments about the progress of the work. They are a separate entity set because only they take part in the Receives, Updates and Writes relationships.25 Ги претставува општинските работници кои ги обработуваат пријавите. Работниците добиваат доделувања, го ажурираат статусот на пријавите и пишуваат коментари за напредокот на работата. Моделирани се како посебно множество ентитети бидејќи само тие учествуваат во релациите Receives, Updates и Writes. 26 26 27 ''' Candidate keys:''' worker_id and email. worker_id is chosen as the primary key for the same reasons as forAdmins.27 '''Кандидат клучеви:''' worker_id и email. За примарен клуч е избран worker_id од истите причини како кај Admins. 28 28 29 ''' Attributes:'''30 * worker_id - numeric, required, auto-generated31 * full_name - text, required, up to 100 characters32 * email - text, required, unique, valid e-mail format33 * password - text, required, stored as a hash29 '''Атрибути:''' 30 * worker_id - нумерички, задолжителен, автоматски генериран 31 * full_name - текст, задолжителен, до 100 знаци 32 * email - текст, задолжителен, единствен, валиден формат на е-пошта 33 * password - текст, задолжителен, се чува како хаш 34 34 35 35 ==== Citizens ==== 36 Represents the citizens who use the application to report communal problems. A citizen can submit many reports and follow their status. Citizens are separate from the other users because only they submit reports, and they have an additional optional contact phone.36 Ги претставува граѓаните кои ја користат апликацијата за пријавување на комунални проблеми. Еден граѓанин може да поднесе многу пријави и да го следи нивниот статус. Граѓаните се одвоени од другите корисници бидејќи само тие поднесуваат пријави и имаат дополнителен незадолжителен телефон за контакт. 37 37 38 ''' Candidate keys:''' citizen_id and email. citizen_id is chosen as the primary key because it is stable, while a citizen may change their e-mail address.38 '''Кандидат клучеви:''' citizen_id и email. За примарен клуч е избран citizen_id бидејќи е стабилен, додека граѓанинот може да ја промени својата е-пошта. 39 39 40 ''' Attributes:'''41 * citizen_id - numeric, required, auto-generated42 * full_name - text, required, up to 100 characters43 * email - text, required, unique, valid e-mail format44 * phone - text, optional, up to 20 characters, digits and the + sign only45 * password - text, required, stored as a hash40 '''Атрибути:''' 41 * citizen_id - нумерички, задолжителен, автоматски генериран 42 * full_name - текст, задолжителен, до 100 знаци 43 * email - текст, задолжителен, единствен, валиден формат на е-пошта 44 * phone - текст, незадолжителен, до 20 знаци, само цифри и знакот + 45 * password - текст, задолжителен, се чува како хаш 46 46 47 47 ==== Categories ==== 48 Represents the categories of communal problems (for example roads, street lighting, waste). Categories are modeled as a separate entity set instead of a text attribute of the report, so that administrators can add and change them, and so that all reports use the same consistent list of categories.48 Ги претставува категориите на комунални проблеми (на пример патишта, улично осветлување, отпад). Категориите се моделирани како посебно множество ентитети, наместо како текстуален атрибут на пријавата, за да можат администраторите да додаваат и менуваат категории и сите пријави да користат иста доследна листа на категории. 49 49 50 ''' Candidate keys:''' category_id and name. name is unique, but a category may be renamed, so category_id is chosen as the primary key.50 '''Кандидат клучеви:''' category_id и name. Името е единствено, но категоријата може да биде преименувана, па затоа за примарен клуч е избран category_id. 51 51 52 ''' Attributes:'''53 * category_id - numeric, required, auto-generated54 * name - text, required, unique, up to 80 characters52 '''Атрибути:''' 53 * category_id - нумерички, задолжителен, автоматски генериран 54 * name - текст, задолжителен, единствен, до 80 знаци 55 55 56 56 ==== Reports ==== 57 Represents a single communal problem reported by a citizen (damaged road, broken street light, waste...). It is the central entity of the system because photos, status changes, comments and assignments all refer to a report.57 Претставува еден комунален проблем пријавен од граѓанин (оштетен пат, неисправно улично осветлување, отпад...). Ова е централниот ентитет на системот, бидејќи фотографиите, промените на статусот, коментарите и доделувањата се однесуваат на пријава. 58 58 59 ''' Candidate keys:''' report_id is the only candidate key. No natural attribute uniquely identifies a report, so a generated numeric identifier is used as the primary key.59 '''Кандидат клучеви:''' report_id е единствениот кандидат клуч. Не постои природен атрибут кој еднозначно ја определува пријавата, па за примарен клуч се користи генериран нумерички идентификатор. 60 60 61 ''' Attributes:'''62 * report_id - numeric, required, auto-generated63 * description - text, required64 * location_text - text, optional (manually entered address)65 * latitude - numeric, optional, between -90 and9066 * longitude - numeric, optional, between -180 and18067 * status - text, required, one of: submitted, received, in_progress, resolved, rejected68 * priority - text, required, one of: low, medium, high, urgent69 * created_at - date and time, required61 '''Атрибути:''' 62 * report_id - нумерички, задолжителен, автоматски генериран 63 * description - текст, задолжителен 64 * location_text - текст, незадолжителен (рачно внесена адреса) 65 * latitude - нумерички, незадолжителен, помеѓу -90 и 90 66 * longitude - нумерички, незадолжителен, помеѓу -180 и 180 67 * status - текст, задолжителен, една од вредностите: submitted, received, in_progress, resolved, rejected 68 * priority - текст, задолжителен, една од вредностите: low, medium, high, urgent 69 * created_at - датум и време, задолжителен 70 70 71 At least one of location_text or latitude/longitude must be entered.71 Мора да се внесе барем едно од location_text или latitude/longitude. 72 72 73 73 ==== Photos ==== 74 Represents a photo attached to a report as visual documentation of the problem. It is modeled as a separate entity set because one report can have several photos, which cannot be stored in a single attribute of the report.74 Претставува фотографија прикачена кон пријава како визуелна документација на проблемот. Моделирана е како посебно множество ентитети бидејќи една пријава може да има повеќе фотографии, кои не можат да се чуваат во еден атрибут на пријавата. 75 75 76 ''' Candidate keys:''' photo_id is the only candidate key and it is used as the primary key.76 '''Кандидат клучеви:''' photo_id е единствениот кандидат клуч и се користи како примарен клуч. 77 77 78 ''' Attributes:'''79 * photo_id - numeric, required, auto-generated80 * image_url - text, required, path or URL of the stored image, up to 500 characters78 '''Атрибути:''' 79 * photo_id - нумерички, задолжителен, автоматски генериран 80 * image_url - текст, задолжителен, патека или URL до зачуваната слика, до 500 знаци 81 81 82 82 ==== !StatusLogs ==== 83 Represents one change of the status of a report. Every change (submitted, received, in progress, resolved, rejected) is recorded as a new entry, so the full history of a report is kept. This provides the transparency and accountability required by the project, because citizens can see when and how their report was processed.83 Претставува една промена на статусот на пријава. Секоја промена (поднесена, примена, во тек, решена, одбиена) се евидентира како нов запис, со што се чува целата историја на пријавата. Ова ја обезбедува транспарентноста и одговорноста што ги бара проектот, бидејќи граѓаните можат да видат кога и како била обработена нивната пријава. 84 84 85 ''' Candidate keys:''' log_id is the only candidate key and it is used as the primary key.85 '''Кандидат клучеви:''' log_id е единствениот кандидат клуч и се користи како примарен клуч. 86 86 87 ''' Attributes:'''88 * log_id - numeric, required, auto-generated89 * status - text, required, the new status: submitted, received, in_progress, resolved orrejected90 * changed_at - date and time, required91 * note - text, optional, explanation of the change87 '''Атрибути:''' 88 * log_id - нумерички, задолжителен, автоматски генериран 89 * status - текст, задолжителен, новиот статус: submitted, received, in_progress, resolved или rejected 90 * changed_at - датум и време, задолжителен 91 * note - текст, незадолжителен, објаснување за промената 92 92 93 93 ==== Comments ==== 94 Represents a comment written by a municipal worker about the progress of solving a report. Comments are a separate entity set because one report can receive many comments over time, each with its own author and time.94 Претставува коментар напишан од општински работник за напредокот на решавањето на пријавата. Коментарите се посебно множество ентитети бидејќи една пријава може да добие многу коментари со текот на времето, секој со свој автор и време. 95 95 96 ''' Candidate keys:''' comment_id is the only candidate key and it is used as the primary key.96 '''Кандидат клучеви:''' comment_id е единствениот кандидат клуч и се користи како примарен клуч. 97 97 98 ''' Attributes:'''99 * comment_id - numeric, required, auto-generated100 * content - text, required101 * created_at - date and time, required98 '''Атрибути:''' 99 * comment_id - нумерички, задолжителен, автоматски генериран 100 * content - текст, задолжителен 101 * created_at - датум и време, задолжителен 102 102 103 103 ==== Assignments ==== 104 Represents the assignment of a report to a municipal worker, made by an administrator. It is modeled as an entity set because the assignment connects three entity sets (Admins, Workers, Reports) and has its own attributes (time and note).104 Претставува доделување на пријава на општински работник, направено од администратор. Моделирано е како множество ентитети бидејќи доделувањето поврзува три множества ентитети (Admins, Workers, Reports) и има свои атрибути (време и забелешка). 105 105 106 ''' Candidate keys:''' assignment_id, and the combination of the assigned report and worker, because the same worker cannot be assigned to the same report twice. assignment_id is chosen as the primary key because it is a single simple value.106 '''Кандидат клучеви:''' assignment_id, како и комбинацијата од доделената пријава и работникот, бидејќи истиот работник не може двапати да биде доделен на истата пријава. За примарен клуч е избран assignment_id бидејќи е една едноставна вредност. 107 107 108 ''' Attributes:'''109 * assignment_id - numeric, required, auto-generated110 * assigned_at - date and time, required111 * note - text, optional, instructions from the administrator108 '''Атрибути:''' 109 * assignment_id - нумерички, задолжителен, автоматски генериран 110 * assigned_at - датум и време, задолжителен 111 * note - текст, незадолжителен, упатства од администраторот 112 112 113 === Relationships===113 === Релации === 114 114 115 115 ==== Manages (Admins - Categories) ==== 116 Each category is created and managed by exactly one administrator, and an administrator can manage many categories. Participation of Categories is total, because every category must have an administrator responsible for it. Participation of Admins is partial, because an administrator does not have to manage any category.116 Секоја категорија е креирана и управувана од точно еден администратор, а еден администратор може да управува со многу категории. Учеството на Categories е тотално, бидејќи секоја категорија мора да има одговорен администратор. Учеството на Admins е парцијално, бидејќи администраторот не мора да управува со ниту една категорија. 117 117 118 118 ==== Classifies (Categories - Reports) ==== 119 Each report belongs to exactly one category, and a category can contain many reports. Participation of Reports is total, because a report cannot be submitted without a category. Participation of Categories is partial, because a new category may still have no reports.119 Секоја пријава припаѓа на точно една категорија, а една категорија може да содржи многу пријави. Учеството на Reports е тотално, бидејќи пријава не може да се поднесе без категорија. Учеството на Categories е парцијално, бидејќи нова категорија сè уште може да нема пријави. 120 120 121 121 ==== Submits (Citizens - Reports) ==== 122 Each report is submitted by exactly one citizen, and a citizen can submit many reports. Participation of Reports is total, because a report cannot exist without its author. Participation of Citizens is partial, because a registered citizen does not have to submit any report.122 Секоја пријава е поднесена од точно еден граѓанин, а еден граѓанин може да поднесе многу пријави. Учеството на Reports е тотално, бидејќи пријава не може да постои без автор. Учеството на Citizens е парцијално, бидејќи регистриран граѓанин не мора да поднесе ниту една пријава. 123 123 124 124 ==== Has (Reports - Photos) ==== 125 Each photo belongs to exactly one report, and a report can have many photos. Participation of Photos is total, because a photo has no meaning without the report it documents. Participation of Reports is partial, because photos are optional.125 Секоја фотографија припаѓа на точно една пријава, а една пријава може да има многу фотографии. Учеството на Photos е тотално, бидејќи фотографијата нема смисла без пријавата што ја документира. Учеството на Reports е парцијално, бидејќи фотографиите се незадолжителни. 126 126 127 127 ==== Logs (Reports - !StatusLogs) ==== 128 Each status change belongs to exactly one report, and a report can have many status changes over time. Participation of !StatusLogs is total, because a status change always refers to a specific report.128 Секоја промена на статус припаѓа на точно една пријава, а една пријава може да има многу промени на статусот со текот на времето. Учеството на !StatusLogs е тотално, бидејќи промената на статус секогаш се однесува на конкретна пријава. 129 129 130 130 ==== Updates (Workers - !StatusLogs) ==== 131 A status change can be made by one worker, and a worker can make many status changes. Participation is partial on both sides, because some status changes are created automatically by the system (for example the initial "submitted" status), so they have no worker.131 Промената на статус може да ја направи еден работник, а еден работник може да направи многу промени. Учеството е парцијално од двете страни, бидејќи некои промени на статусот ги креира системот автоматски (на пример почетниот статус „поднесена“), па немаат работник. 132 132 133 133 ==== Comments on (Reports - Comments) ==== 134 Each comment refers to exactly one report, and a report can have many comments. Participation of Comments is total, because a comment always refers to a report.134 Секој коментар се однесува на точно една пријава, а една пријава може да има многу коментари. Учеството на Comments е тотално, бидејќи коментарот секогаш се однесува на пријава. 135 135 136 136 ==== Writes (Workers - Comments) ==== 137 Each comment is written by exactly one worker, and a worker can write many comments. Participation of Comments is total, because every comment must have an author.137 Секој коментар е напишан од точно еден работник, а еден работник може да напише многу коментари. Учеството на Comments е тотално, бидејќи секој коментар мора да има автор. 138 138 139 139 ==== Assigns (Admins - Assignments) ==== 140 Each assignment is made by exactly one administrator, and an administrator can make many assignments. Participation of Assignments is total, because every assignment must be made by an administrator.140 Секое доделување е направено од точно еден администратор, а еден администратор може да направи многу доделувања. Учеството на Assignments е тотално, бидејќи секое доделување мора да биде направено од администратор. 141 141 142 142 ==== Assigned via (Reports - Assignments) ==== 143 Each assignment refers to exactly one report, and a report can be assigned several times (for example to several workers). Participation of Assignments is total. Participation of Reports is partial, because a new report is not yet assigned.143 Секое доделување се однесува на точно една пријава, а една пријава може да биде доделена повеќепати (на пример на повеќе работници). Учеството на Assignments е тотално. Учеството на Reports е парцијално, бидејќи нова пријава сè уште не е доделена. 144 144 145 145 ==== Receives (Workers - Assignments) ==== 146 Each assignment is given to exactly one worker, and a worker can receive many assignments. Participation of Assignments is total. Participation of Workers is partial, because a worker may currently have no assignments.146 Секое доделување е дадено на точно еден работник, а еден работник може да добие многу доделувања. Учеството на Assignments е тотално. Учеството на Workers е парцијално, бидејќи работникот моментално може да нема доделувања. 147 147 148 == Entity-Relationship Model History==148 == Историја на ЕР моделот == 149 149 150 * '''v01''' - Initial version of the ER model.150 * '''v01''' - Почетна верзија на ЕР моделот. 151 151 152 == AI Use==152 == Користење на вештачка интелигенција == 153 153 154 [wiki:ERModelAIUsage ER Model AI Usage]154 [wiki:ERModelAIUsage Користење на вештачка интелигенција за ЕР моделот]
