| 1 | = Нормализација и Подобрување на дизајн |
| 2 | == Функционални зависности(ФЗ) |
| 3 | Со цел целосно репрезентирање на атрибутите присутни во релациското мапирање, одредени атрибути со исти имиња ќе бидат преименувани. Лесно се заприметуваат таквите атрибути во релацијата R, на пр. **user(id) -> user_id** и **permission(name) -> permission_name**. |
| 4 | {{{ |
| 5 | R( |
| 6 | user: username, description, password, registered_at, email, sex,is_active,name, user_id |
| 7 | feedback: feedback_submission_type, feedback_created_at, feedback_description |
| 8 | submission: submission_id, submission_status, submission_created_at, submission_description, |
| 9 | blacklisted_user: blacklisted_start_date, blacklisted_end_date, reason |
| 10 | tag: tag_name, |
| 11 | thread: thread_id, thread_created_at, thread_content |
| 12 | topic_thread: guidelines, topic_title, parent_id |
| 13 | project_thread: repo_url, project_title, |
| 14 | is_moderated_by: moderator_started_at, |
| 15 | associated_with: asc_started_at, asc_ended_at, |
| 16 | channel: channel_name, channel_description, |
| 17 | project_resource: resource_id, |
| 18 | permissions: perm_name, |
| 19 | project_roles: pr_name, pr_id, pr_override_type, |
| 20 | sends_message_in: msg_send_at, msg_content, |
| 21 | moderator: moderator_id |
| 22 | ) |
| 23 | }}} |
| 24 | |
| 25 | === Иницијални ФЗ |
| 26 | |
| 27 | 1. {{{ user_id -> username, description, password, registered_at, email, sex,is_active,name }}} |
| 28 | |
| 29 | 2. {{{ username -> user_id, description, password, registered_at, email, sex,is_active,name }}} |
| 30 | |
| 31 | 3. {{{ submission_id -> feedback_submission_type, feedback_created_at, feedback_description }}} |
| 32 | |
| 33 | 4. {{{ submission_id -> submission_status, submission_created_at, submission_description }}} |
| 34 | |
| 35 | 5. {{{ {user_id,moderator_id, thread_id, blacklisted_start_date} -> blacklisted_end_date, reason }}} |
| 36 | |
| 37 | 6. {{{ {thread_id, moderator_id} -> moderator_started_at }}} |
| 38 | |
| 39 | 7. {{{ thread_id -> thread_created_at, thread_content }}} |
| 40 | |
| 41 | 8. {{{ thread_id -> guidelines, topic_title, parent_id }}} |
| 42 | |
| 43 | 9. {{{ thread_id -> repo_url, project_title }}} |
| 44 | |
| 45 | 10. {{{ {thread_id, user_id } -> asc_started_at, asc_ended_at }}} |
| 46 | |
| 47 | 11. {{{ {thread_id, channel_name} -> channel_description }}} |
| 48 | |
| 49 | 12. {{{ resource_id -> channel_description, channel_name, thread_id }}} |
| 50 | |
| 51 | 13. {{{ {thread_id, msg_send_at, user_id } -> msg_content }}} |
| 52 | |
| 53 | 14. {{{ pr_id -> pr_name, pr_override_type }}} |
| 54 | |
| 55 | 15. {{{ moderator_id -> user_id }}} |
| 56 | |
| 57 | 16. {{{ parent_id -> thread_id }}} |
| 58 | |
| 59 | 17. {{{ project_title -> repo_url, thread_id, thread_created_at, thread_content }}} |
| 60 | |
| 61 | 18. {{{ {parent_id, topic_title} -> guidelines, thread_id, thread_created_at, thread_content }}} |
| 62 | |
| 63 | 19. {{{ {pr_name, thread_id} -> pr_override_type }}} |
| 64 | |
| 65 | === Изведени ФЗ |
| 66 | |
| 67 | 1. {{{ resource_id -> thread_created_at, thread_content }}} |
| 68 | |
| 69 | 2. {{{ resource_id -> guidelines, topic_title, parent_id }}} |
| 70 | |
| 71 | 3. {{{ resource_id -> repo_url, project_title }}} |
| 72 | |
| 73 | 4. {{{ moderator_id -> user_id }}} |
| 74 | |
| 75 | 5. {{{ parent_id -> thread_id }}} |
| 76 | |
| 77 | === Анализа на функционални зависности |
| 78 | За анализата на функционални зависности ќе го користиме методот на LHS/RHS поделба. Според овај метод потребно е да ги поделиме атрибутите во 3 групи, односно атрибути што се среќаваат на лева страна од Функционалните зависности(LHS) и според истата логика атрибути на десна страна и атрибути кои се среќаваат на 2те страни. |
| 79 | |
| 80 | > **LHS**: |
| 81 | >> {{{ user_id, username, submission_id, moderator_id, thread_id, parent_id, pr_name, channel_name }}} |
| 82 | |
| 83 | > **RHS**: |
| 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, moderator_started_at, thread_created_at, thread_content, guidelines, topic_title, repo_url, project_title, asc_started_at, asc_ended_at, channel_description, msg_content, pr_override_type }}} |
| 85 | |
| 86 | > **LHS & RHS**: |
| 87 | >> {{{ user_id, username, thread_id, parent_id, pr_name, moderator_id }}} |
| 88 | |
| 89 | == Нормализација |
| 90 | |
| 91 | === Сегашна нормална форма |
| 92 | |
| 93 | Имајќи предвид дека guidelines e повеќе вредносен атрибути, доаѓаме до заклучок дека сегашната имплементација на релација не е ни во 1NF форма. |
| 94 | |
| 95 | === Декомпозиција на R во 1NF |
| 96 | Со оделување на guidelines во посебна релација {{{ R1(thread_id, guideline) }}} и {{{ R2(username, thread_id, password...) }}} постигнуваме релациите да се во 1NF. |
| 97 | |
| 98 | Според досега разгледаното за R1(thread_id, guideline) ги имаме следниве ФЗ: |
| 99 | |
| 100 | 1. {{{ thread_id -> thread_id }}} |
| 101 | 2. {{{ guideline -> guideline }}} |
| 102 | |
| 103 | Според функционалните зависимости, единствената комбинација на атрибути која го задоволува условот за супер клуч е {{{ {thread_id, guideline} }}}, бидејќи {{{ {thread_id, guideline}+ = {thread_id, guideline} }}}. Сепак, со цел да оптимизираме операциите на базата (особено внесување и пребарување), ќе воведеме нов сурогат клуч **id** како примарен клуч. Заедно со него ги додаваме и следниве ФЗ {{{ id -> thread_id, guideline }}}. |
| 104 | |
| 105 | Ова е практично бидејќи природниот клуч {{{ {thread_id, guideline} }}} содржи guideline, која е varchar атрибут со променлива големина. Ако се користеше само природниот клуч, PostgreSQL ќе креираше B-tree индекс врз guideline, кој е поголем по големина и поради тоа побавно ќе се ажурира при **DRU** операции (потребни се повеќе IO страници за индексирање и податоци). Со воведување на сурогат клуч **id** како мал фиксно-димензионален атрибут (на пр. serial или bigserial), индексите се помали и операциите се поефикасни. |
| 106 | |
| 107 | # Не сум најсигурен за ова, имат смисла. Аргумент против ова е дека според вака дефинираното значит дека не смет некој guideline да се повторвит, шо да ќе клајме unqiue constraint, ама тогаш немат нешто шо оптимизиравме и падвит во вода нештово. Така да можда ке требат да се препишит имајќи го во предвид фактот дека некоја уникатност без id. |
| 108 | |
| 109 | Со ова R1 ни се совпаѓат со релацијата **topic_guidelines**, отсега понатаму ќе ја референцираме како таква. |
| 110 | |
| 111 | === Декомпозиција R1 до BCNF |
| 112 | Според следниве ФЗ за R1: |
| 113 | 1. {{{ thread_id -> thread_id }}} |
| 114 | 2. {{{ guideline -> guideline }}} |
| 115 | 3. {{{ id -> thread_id, guideline }}} |
| 116 | |
| 117 | Според тоа што само **id** ги определува сите атрибути({{{ id+ -> id,thread_id,guideline}}}) следува дека единствен супер клуч е **id**. |
| 118 | |
| 119 | Клуч за оваа релациja би бил **id**, бидејќи неговиот затварач е {{{ id+ = {thread_id, guideline} }}} и е најмал затварач кој ја определува целата релација. |
| 120 | |
| 121 | Според 2NF релацијата не смеe да содржи парцијални зависности. Ова веќе е задоволено од ФЗ за R1. |
| 122 | Според 3NF релацијата потребно е секоја ФЗ(X->A) да ги задоволи следниве својства: |
| 123 | |
| 124 | 1. X e супер клуч на R |
| 125 | 2. А е примарен атрибут во R. |
| 126 | |
| 127 | Според ова релацијата е веќе во 3NF. |
| 128 | Според BCNF секоја релација потребно е да го задоволува следново својство: |
| 129 | "За секое нетривијално (X->A) важи дека X е суперклуч на R". |
| 130 | Според тоа што **id** e клуч на R1, следува дека релацијата е во BCNF. |
| 131 | |
| 132 | === Декомпозиција R2 во 2NF |
| 133 | Најпрвин да согледаме дека во било кој супер клуч атрибутите кои се присутни само на левата страна мора да бидат вклучени. Најпрвин да започниме само со тие атрибути: |
| 134 | |
| 135 | {{{ |
| 136 | {user_id, channel_name, moderator_id, start_date, submission_id, start_at_developer, sent_at, custom_role_name , thread_id} = { |
| 137 | user_id, channel_name, moderator_id, start_date, submission_id, start_at_developer, sent_at, custom_role_name , thread_id, username, description, password, register_at, email,sex,is_active,name, project_title,repo_url, topic_title, guidelines, parent, thread_created_at, content, channel_description, end_date, status, submission_description, submission_created_at, submission_type,feedback_created_at,feedback_description, end_at_developer, message_content, custom_role_description, moderator_started_at, |
| 138 | } |
| 139 | }}} |
| 140 | |
| 141 | Според тоа што затворачот ги опфаќа сите атрибути може да се заклучи дека ова е најминималното множество чиишто покривач ја дава целата релација, што значи дека е примарен клуч. |
| 142 | |
| 143 | Имајќи во предвид примарниот клуч можит да ги изведиме следниве релации, притоа кај релациите кај кои има совпаѓање со некоја релација од релационото мапирање, ќе ги додаваме нивните имиња. |
| 144 | |
| 145 | |
| 146 | {{{ R21(user_id,username, description, password, register_at, email,sex,is_active,name) == users }}} |
| 147 | R22(project_title,repo_url,topic_title,guidelines,parent,thread_created_at,content) |
| 148 | {{{ R23(thread_id,channel_name,channel_description, channel_creator_id) == channel }}} |
| 149 | {{{ R24(thread_id,moderator_id,user_id,start_date,end_date) }}} |
| 150 | {{{ 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. |
| 151 | {{{ R26(thread_id,user_id, start_at_developer,end_at_developer) == developer_associated_with_project }}} |
| 152 | {{{ R27(thread_id, channel_name, message_sent_by_id, sent_at, message_content) === messages}}} |
| 153 | {{{ R28(thread_id,custom_role_name,custom_role_description) == project_roles }}} |
| 154 | {{{ R29(thread_id,moderator_id,moderator_started_at) == topic_threads_moderators}}} |
| 155 | |
| 156 | |
| 157 | |
| 158 | |
| 159 | |
| 160 | |