28 | | 1. {{{ user_id -> username, description, password, registered_at, email, sex,is_active,name }}} |
29 | | |
30 | | 2. {{{ username -> user_id, description, password, registered_at, email, sex,is_active,name }}} |
| 29 | 1. {{{ user_id -> username, description, password, registered_at, email, sex,is_active,name }}} |
| 30 | |
| 31 | 2. {{{ username -> user_id, description, password, registered_at, email, sex,is_active,name }}} |
48 | | 11. {{{ {thread_id, channel_name} -> channel_description,resource_id }}} |
49 | | |
50 | | 12. {{{ resource_id -> channel_description, channel_name, thread_id }}} |
51 | | |
52 | | 13. {{{ {thread_id, msg_send_at, user_id } -> msg_content }}} |
53 | | |
54 | | 14. {{{ pr_id -> pr_name, pr_override_type }}} |
55 | | |
56 | | 15. {{{ moderator_id -> user_id }}} |
57 | | |
58 | | 16. {{{ parent_id -> thread_id }}} |
59 | | |
60 | | 17. {{{ project_title -> repo_url, thread_id, thread_created_at, thread_content }}} |
61 | | |
62 | | 18. {{{ {parent_id, topic_title} -> guidelines, thread_id, thread_created_at, thread_content }}} |
63 | | |
64 | | 19. {{{ {pr_name, thread_id} -> pr_override_type }}} |
| 49 | 11. {{{ channel_UUID -> channel_name,channel_description}}} |
| 50 | |
| 51 | 12. {{{ {thread_id, msg_send_at, user_id } -> msg_content }}} |
| 52 | |
| 53 | 13. {{{ pr_id -> pr_name, pr_override_type }}} |
| 54 | |
| 55 | 15. {{{ parent_id -> thread_id }}} |
| 56 | |
| 57 | 16. {{{ project_title -> repo_url, thread_id, thread_created_at, thread_content }}} |
| 58 | |
| 59 | 17. {{{ {parent_id, topic_title} -> guidelines, thread_id, thread_created_at, thread_content }}} |
| 60 | |
| 61 | 18. {{{ {pr_name, thread_id} -> pr_override_type }}} |
| 62 | |
| 63 | 19. {{{ blacklisted_about_user -> user_id }}} |
68 | | 1. {{{ resource_id -> thread_created_at, thread_content }}} |
69 | | |
70 | | 2. {{{ resource_id -> guidelines, topic_title, parent_id }}} |
71 | | |
72 | | 3. {{{ resource_id -> repo_url, project_title }}} |
73 | | |
74 | | 4. {{{ moderator_id -> user_id }}} |
75 | | |
76 | | 5. {{{ parent_id -> thread_id }}} |
| 67 | 2. {{{ parent_id -> thread_id }}} |
| 68 | |
| 69 | 3. {{{ parent_id -> thread_created_at, thread_content }}} |
| 70 | |
| 71 | 4. {{{ parent_id -> guidelines, topic_title, parent_id }}} |
| 72 | |
| 73 | 5. {{{ parent_id -> repo_url, project_title }}} |
| 74 | |
| 75 | 6. {{{ blacklisted_about_user -> username, description, password, registered_at, email, sex,is_active,name }}} |
85 | | >> {{{ description, password, registered_at, email, sex,is_active,name, feedback_submission_type, feedback_created_at, feedback_description, submission_status, submission_created_at, submission_description,blacklisted_end_date, reason, tag_name,thread_created_at, thread_content, guidelines,repo_url, moderator_started_at, asc_started_at, channel_description, perm_name, pr_override_type, msg_content }}} |
| 84 | >> {{{ description, password, registered_at, email, sex,is_active,name, feedback_submission_type, feedback_created_at, feedback_description, submission_status, submission_created_at, submission_description,blacklisted_end_date, reason, tag_name,thread_created_at, thread_content, guidelines,repo_url, moderator_started_at, asc_started_at, channel_description, perm_name, pr_override_type, msg_content }}} |
141 | | tag_name, |
142 | | perm_name}+ = { |
143 | | submission_id, |
144 | | moderator_id, |
145 | | blacklisted_start_date, |
146 | | resource_id,msg_send_at, |
147 | | pr_id, |
148 | | perm_name, |
149 | | feedback_submission_type, |
150 | | feedback_created_at, |
151 | | feedback_description, |
152 | | submission_status, |
153 | | submission_created_at, |
154 | | submission_description, |
155 | | user_id, |
156 | | channel_description, |
157 | | channel_name, |
| 144 | msg_send_at |
| 145 | } = { |
| 146 | submission_id |
| 147 | blacklisted_start_date |
| 148 | msg_send_at |
| 149 | pr_id |
| 150 | tag_name |
| 151 | perm_name |
| 152 | blacklisted_about_user |
| 153 | channel_UUID, |
| 154 | feedback_submission_type, feedback_created_at, feedback_description, |
| 155 | submission_status, submission_created_at, submission_description , |
| 156 | channel_name,channel_description, |
| 157 | pr_name, pr_override_type, |
| 158 | user_id, |
| 159 | username, description, password, registered_at, email, sex,is_active,name, |
| 160 | blacklisted_end_date, reason, |
| 161 | moderator_started_at, |
| 162 | thread_created_at, thread_content, |
| 163 | topic_title, parent_id, |
| 164 | repo_url, project_title, |
| 165 | asc_started_at, asc_ended_at, |
| 166 | msg_send_at,msg_content, |
186 | | Според тоа што затворачот ги опфаќа сите атрибути може да се заклучи дека ова е најминималното множество чиишто покривач ја дава целата релација, што значи дека е примарен клуч. |
187 | | |
188 | | Имајќи во предвид примарниот клуч можит да ги изведиме следниве релации, притоа кај релациите кај кои има совпаѓање со некоја релација од релационото мапирање, ќе ги додаваме нивните имиња. |
189 | | |
190 | | |
191 | | {{{ R21(user_id,username, description, password, register_at, email,sex,is_active,name) == users }}} |
192 | | R22(project_title,repo_url,topic_title,guidelines,parent,thread_created_at,content) |
193 | | {{{ R23(thread_id,channel_name,channel_description, channel_creator_id) == channel }}} |
194 | | {{{ R24(thread_id,moderator_id,user_id,start_date,end_date) }}} |
195 | | {{{ R25(submission_id,status,submission_description,submission_created_at, submission_type,feedback_created_at,feedback_description, feedback_creator_id, submission_creator_id) }}} #Tuka ke imame problem, ama mozhit da rechime deka procenavme deka ke imat dosta nullki pa zaradi to rekovme da se odelat vo posebna relacija. |
196 | | {{{ R26(thread_id,user_id, start_at_developer,end_at_developer) == developer_associated_with_project }}} |
197 | | {{{ R27(thread_id, channel_name, message_sent_by_id, sent_at, message_content) === messages}}} |
198 | | {{{ R28(thread_id,custom_role_name,custom_role_description) == project_roles }}} |
199 | | {{{ R29(thread_id,moderator_id,moderator_started_at) == topic_threads_moderators}}} |
200 | | |
201 | | |
202 | | |
203 | | |
| 172 | {{{ R1(user_id,username, description, password, registered_at, email, sex,is_active,name) }}} /done |
| 173 | |
| 174 | {{{ R2(submission_id,feedback_submission_type, feedback_created_at, feedback_description,submission_status, submission_created_at, submission_description)}}} / done |
| 175 | |
| 176 | {{{ R3(blacklisted_about_user,user_id, thread_id, blacklisted_start_date,blacklisted_end_date, reason) }}} |
| 177 | |
| 178 | {{{ R4(thread_id, user_id, moderator_started_at, moderator_started_at) }}} /done |
| 179 | |
| 180 | {{{ R5(thread_id,thread_created_at, thread_content,topic_title, parent_id,repo_url, project_title) }}} |
| 181 | |
| 182 | {{{ R6(channel_UUID,channel_name,channel_description) }}} /done |
| 183 | |
| 184 | {{{ R7(pr_id,pr_name, pr_override_type) }}} /done |
| 185 | |
| 186 | {{{ R8(thread_id, msg_send_at, user_id,msg_content) }}} /done |
205 | | |
| 188 | {{{ R9(thread_id,user_id,asc_started_at, asc_ended_at) }}} #thread_id, user_id / done |
| 189 | |
| 190 | {{{ R10(perm_name) }}} / done |
| 191 | {{{ R11(tag_name) }}} / done |
| 192 | |
| 193 | === Нормализација на R1 до 3NF |
| 194 | Најпрвин да заприметиме дека оваа релација е устaри релацијата **users**. |
| 195 | За оваа релација важат следниве ФЗс: |
| 196 | 1. {{{user_id -> username, description, password, registered_at, email, sex,is_active,name}}} |
| 197 | |
| 198 | 2. {{{username -> user_id, description, password, registered_at, email, sex,is_active,name }}} |
| 199 | |
| 200 | Од тоа што немаме транзитивни зависности во оваа релациja, следува дека **R1** e веќе во 3NF. |
| 201 | |
| 202 | === Нормализација на R1 до BCNF |
| 203 | |
| 204 | Oд претходниот чекор согледуваме дека секоја ФЗс вклучува супер клуч, што значи дека релацијта **R1** e веќе во BCNF. |
| 205 | |
| 206 | === Нормализација на R2 до 3NF |
| 207 | Да заприметиме дека единствени ФЗс за оваа релација се: |
| 208 | 1. {{{ submission_id -> feedback_submission_type, feedback_created_at, feedback_description }}} |
| 209 | |
| 210 | 2. {{{ submission_id -> submission_status, submission_created_at, submission_description }}} |
| 211 | |
| 212 | Со користење правилото Унија/Декомпозиција од привалата за изведување на Армстронг добиваме: |
| 213 | |
| 214 | 1. {{{ submission_id -> submission_status, submission_created_at, submission_description, feedback_submission_type, feedback_created_at, feedback_description}}} |
| 215 | |
| 216 | Од тоа што немаме транзитивни зависности, следува дека **R2** е веќе во 3NF. |
| 217 | |
| 218 | === Нормализација на R2 до BCNF |
| 219 | |
| 220 | Од претходниот чекор, согледаме дека имаме само една ФЗ, што значи дека таа ФЗ мора да содржи суперклуч за релациjaта. Според претходно дискусираното согледуваме дека **R2** e веќе во BCNF. |
| 221 | |
| 222 | === Подобрување на нормализација на R2 |
| 223 | |
| 224 | Oд демонот на апликацијата согледува дека не секој submission мора да има feedback, тоа значи дека доста инстанци ќе имат null вредности за колоните feedback_submission_type, feedback_created_at, feedback_description. Со цел одбегнување на записи со доста null вредности ќе изведиме 2 нови релации. |
| 225 | |
| 226 | 1. {{{ R21(submission_id,submission_status, submission_created_at, submission_description) }}} |
| 227 | 2. {{{ R22(submission_id,feedback_submission_type, feedback_created_at, feedback_description) }}} |
| 228 | |
| 229 | На овај начин доколку некој submission нема feedback тогаш нема да има запис во **R22** и нема да има null вредности во записите. За разлика од претходното решение доста каде што feedback колоните би биле полни со null вредности. |
| 230 | |
| 231 | Притоа да согледаме дека **R21** e релациjaта **submission** и **R22** е **feedback**. |
| 232 | |
| 233 | === Нормализација на R7 до BCNF |
| 234 | Единствена ФЗ присутна во оваа релациja е: |
| 235 | |
| 236 | {{{pr_id -> pr_name, pr_override_type}}} |
| 237 | |
| 238 | R7 е веќе во BCNF, заради тоа што единствената ФЗ го вклучува суперклучот и нема транзитивни зависимости. |
| 239 | |
| 240 | === Нормализација на R4 до BCNF |
| 241 | Единствена ФЗ присутна во оваа релациja е: |
| 242 | |
| 243 | |
| 244 | {{{ {thread_id, user_id} -> moderator_started_at, moderator_started_at}}} |
| 245 | |
| 246 | R4 е веќе во BCNF, заради тоа што единствената ФЗ го вклучува суперклучот и нема транзитивни зависимости. |
| 247 | |
| 248 | === Нормализација на R6 до BCNF |
| 249 | Единствена ФЗ присутна во оваа релациja е: |
| 250 | |
| 251 | {{{channel_UUID -> channel_name,channel_description}}} |
| 252 | |
| 253 | R6 е веќе во BCNF, заради тоа што единствената ФЗ го вклучува суперклучот и нема транзитивни зависимости. |
| 254 | |
| 255 | === Нормализација на R8 до BCNF |
| 256 | Единствена ФЗ присутна во оваа релациja е: |
| 257 | |
| 258 | {{{ {thread_id, msg_send_at, user_id} -> msg_content}}} |
| 259 | |
| 260 | R8 е веќе во BCNF, заради тоа што единствената ФЗ го вклучува суперклучот и нема транзитивни зависимости. |
| 261 | |
| 262 | === Нормализација на R9 до BCNF |
| 263 | Единствена ФЗ присутна во оваа релациja е: |
| 264 | |
| 265 | {{{{thread_id,user_id} -> asc_started_at, asc_ended_at}}} |
| 266 | |
| 267 | R9 е веќе во BCNF, заради тоа што единствената ФЗ го вклучува суперклучот и нема транзитивни зависности. |
| 268 | |
| 269 | === Нормализација на R10 до BCNF |
| 270 | Најпрвин да заприметиме дека R10 е уствари релацијата **permissions**. |
| 271 | |
| 272 | Бидејќи немаме транзитивни релации и бидејќи {{{ perm_name+ = {perm_name} }}} е супер клуч на релацијата, добиваме дека **R1** е во BCNF. |
| 273 | |
| 274 | === Нормализација на R11 |
| 275 | Најпрвин да заприметиме декa R11 е уствари релацијата **tag**. Исто како и кај **R10**, лесно се согледува дека и оваа релација е во BCNF. |