Changes between Version 8 and Version 9 of Normalization


Ignore:
Timestamp:
09/22/25 20:24:05 (13 hours ago)
Author:
226026
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v8 v9  
     1Note:
     2- moderator_id izbrishi nasekade
     3- klaj unique constraint na (parent_id,topic_title)
     4
    15= Нормализација и Подобрување на дизајн
    26== Функционални зависности(ФЗ) 
     
    48{{{
    59R(
    6    user: username, description, password, registered_at, email, sex,is_active,name, user_id #9
     10   user: username, description, password, registered_at, email, sex,is_active,name, user_id
    711  feedback: feedback_submission_type, feedback_created_at, feedback_description
    812  submission: submission_id, submission_status, submission_created_at, submission_description,
    913  blacklisted_user: blacklisted_start_date, blacklisted_end_date, reason,blacklisted_about_user
    10   tag: tag_name, #20
     14  tag: tag_name,
    1115  thread: thread_id, thread_created_at, thread_content
    1216  topic_thread: guidelines, topic_title, parent_id 
     
    1418  is_moderated_by: moderator_started_at,
    1519  associated_with: asc_started_at, asc_ended_at,
    16   channel: channel_name, channel_description,
    17   project_resource: resource_id,
     20  channel: channel_name, channel_description, channel_UUID
    1821  permissions: perm_name,
    1922  project_roles: pr_name, pr_id, pr_override_type,
    2023  sends_message_in: msg_send_at, msg_content,
    21   moderator: moderator_id
    22 
    2324)
    2425}}}
     
    2627=== Иницијални ФЗ
    2728
    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 }}}
     291. {{{ user_id ->  username, description, password, registered_at, email, sex,is_active,name }}}  
     30
     312. {{{ username -> user_id, description, password, registered_at, email, sex,is_active,name }}} 
    3132
    32333. {{{ submission_id -> feedback_submission_type, feedback_created_at, feedback_description }}}
     
    34354. {{{ submission_id ->  submission_status, submission_created_at, submission_description }}}
    3536
    36 5. {{{ {blacklisted_about_user,moderator_id, thread_id, blacklisted_start_date} ->  blacklisted_end_date, reason }}}
    37 
    38 6. {{{ {thread_id, moderator_id} -> moderator_started_at }}}
     375. {{{ {blacklisted_about_user,user_id, thread_id, blacklisted_start_date} ->  blacklisted_end_date, reason }}}
     38
     396. {{{ {thread_id, user_id} -> moderator_started_at }}}
    3940
    40417. {{{ thread_id -> thread_created_at, thread_content }}}
    4142
    42 8. {{{ thread_id -> guidelines, topic_title, parent_id }}}
     438. {{{ thread_id -> guidelines, topic_title, parent_id }}} 
    4344
    44459. {{{ thread_id -> repo_url, project_title }}}
     
    464710. {{{ {thread_id, user_id } -> asc_started_at, asc_ended_at }}}
    4748
    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 }}}
     4911. {{{ channel_UUID ->  channel_name,channel_description}}} 
     50
     5112. {{{ {thread_id, msg_send_at, user_id } -> msg_content }}}
     52
     5313. {{{ pr_id -> pr_name, pr_override_type }}}
     54
     5515. {{{ parent_id -> thread_id }}}
     56
     5716. {{{ project_title -> repo_url, thread_id, thread_created_at, thread_content  }}}
     58
     5917. {{{ {parent_id, topic_title} -> guidelines, thread_id, thread_created_at, thread_content }}}
     60
     6118. {{{ {pr_name, thread_id} -> pr_override_type }}}
     62
     6319. {{{ blacklisted_about_user -> user_id  }}}
    6564
    6665=== Изведени ФЗ
    6766
    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 }}}
     672. {{{ parent_id -> thread_id }}}
     68
     693. {{{ parent_id -> thread_created_at, thread_content }}}
     70
     714. {{{ parent_id -> guidelines, topic_title, parent_id }}}
     72
     735. {{{ parent_id -> repo_url, project_title }}}
     74
     756. {{{ blacklisted_about_user -> username, description, password, registered_at, email, sex,is_active,name }}}
    7776
    7877=== Анализа на функционални зависности
     
    8079
    8180> **LHS**:
    82 >> {{{ submission_id, moderator_id,blacklisted_start_date, msg_send_at,pr_id,tag_name,perm_name,blacklisted_about_user}}}
     81>> {{{ submission_id, moderator_id,blacklisted_start_date, msg_send_at,pr_id,tag_name,perm_name,blacklisted_about_user, channel_UUID}}}
    8382
    8483> **RHS**:
    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 }}}
    8685
    8786> **LHS & RHS**:
    88 >> {{{ user_id,thread_id,username,channel_name,parent_id,project_title,topic_title, pr_name,resource_id }}}
     87>> {{{ user_id,thread_id,username,channel_name,parent_id,project_title,topic_title, pr_name}}}
    8988
    9089== Нормализација
     
    130129
    131130=== Декомпозиција R2 во 2NF
    132 
     131Доколку би ги избрале само атрибутите на левата страна, во таков случај не би можеле да пристапиме до сите ФЗ во кои е вклучен thread_id. Заради тоа ке го избериме thread_id. Со него имаме:
    133132{{{
    134 {submission_id,
    135 moderator_id,
    136 blacklisted_start_date,
    137 resource_id,
    138 msg_send_at,
    139 pr_id,
     133    {
     134submission_id
     135user_id,
     136blacklisted_start_date
     137msg_send_at
     138pr_id
     139tag_name
     140perm_name
     141channel_UUID,
     142thread_id,
    140143blacklisted_about_user,
    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,
     144msg_send_at
     145} = {
     146submission_id
     147blacklisted_start_date
     148msg_send_at
     149pr_id
     150tag_name
     151perm_name
     152blacklisted_about_user
     153channel_UUID,
     154feedback_submission_type, feedback_created_at, feedback_description,
     155submission_status, submission_created_at, submission_description ,
     156channel_name,channel_description,
     157pr_name, pr_override_type,
     158user_id,
     159username, description, password, registered_at, email, sex,is_active,name,
     160blacklisted_end_date, reason,
     161moderator_started_at,
     162thread_created_at, thread_content,
     163topic_title, parent_id,
     164repo_url, project_title,
     165asc_started_at, asc_ended_at,
     166msg_send_at,msg_content,
    158167thread_id,
    159 thread_created_at,
    160 thread_content,
    161 topic_title,
    162 parent_id,
    163 repo_url,
    164 project_title,
    165 msg_content,
    166 pr_name,
    167 pr_override_type,
    168 username,
    169 description,
    170 password,
    171 registered_at,
    172 email,
    173 sex,
    174 is_active,
    175 name,
    176 blacklisted_end_date,
    177 reason,
    178 tag_name,
    179 moderator_started_at,
    180 asc_started_at,
    181 asc_ended_at
     168pr_override_type
    182169}
    183 
    184170}}}
    185171
    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
    204187 
    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За оваа релација важат следниве ФЗс:
     1961. {{{user_id ->  username, description, password, registered_at, email, sex,is_active,name}}}
     197
     1982. {{{username -> user_id, description, password, registered_at, email, sex,is_active,name }}}
     199
     200Од тоа што немаме транзитивни зависности во оваа релациja, следува дека **R1** e веќе во 3NF.
     201
     202=== Нормализација на R1 до BCNF
     203
     204Oд претходниот чекор согледуваме дека секоја ФЗс вклучува супер клуч, што значи дека релацијта **R1** e веќе во BCNF.
     205
     206=== Нормализација на R2 до 3NF
     207Да заприметиме дека единствени ФЗс за оваа релација се:
     2081. {{{ submission_id -> feedback_submission_type, feedback_created_at, feedback_description }}}
     209
     2102. {{{ submission_id ->  submission_status, submission_created_at, submission_description }}}
     211
     212Со користење правилото Унија/Декомпозиција од привалата за изведување на Армстронг добиваме:
     213
     2141. {{{ 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
     224Oд демонот на апликацијата согледува дека не секој submission мора да има feedback, тоа значи дека доста инстанци ќе имат null вредности за колоните feedback_submission_type, feedback_created_at, feedback_description. Со цел одбегнување на записи со доста null вредности ќе изведиме 2 нови релации.
     225
     2261. {{{ R21(submission_id,submission_status, submission_created_at, submission_description) }}} 
     2272. {{{ 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
     238R7 е веќе во BCNF, заради тоа што единствената ФЗ го вклучува суперклучот и нема транзитивни зависимости.
     239
     240=== Нормализација на R4 до BCNF
     241Единствена ФЗ присутна во оваа релациja е:
     242 
     243
     244{{{ {thread_id, user_id} -> moderator_started_at, moderator_started_at}}}
     245
     246R4 е веќе во BCNF, заради тоа што единствената ФЗ го вклучува суперклучот и нема транзитивни зависимости.
     247
     248=== Нормализација на R6 до BCNF
     249Единствена ФЗ присутна во оваа релациja е:
     250
     251{{{channel_UUID -> channel_name,channel_description}}}
     252
     253R6 е веќе во BCNF, заради тоа што единствената ФЗ го вклучува суперклучот и нема транзитивни зависимости.
     254
     255=== Нормализација на R8 до BCNF
     256Единствена ФЗ присутна во оваа релациja е:
     257
     258{{{ {thread_id, msg_send_at, user_id} -> msg_content}}}
     259
     260R8 е веќе во BCNF, заради тоа што единствената ФЗ го вклучува суперклучот и нема транзитивни зависимости.
     261
     262=== Нормализација на R9 до BCNF
     263Единствена ФЗ присутна во оваа релациja е:
     264
     265{{{{thread_id,user_id} -> asc_started_at, asc_ended_at}}}
     266
     267R9 е веќе во 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.