| | 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 | |