Changes between Initial Version and Version 1 of Normalization


Ignore:
Timestamp:
09/21/25 23:02:34 (37 hours ago)
Author:
225144
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v1 v1  
     1= Нормализација и Подобрување на дизајн
     2== Функционални зависности(ФЗ) 
     3Со цел целосно репрезентирање на атрибутите присутни во релациското мапирање, одредени атрибути со исти имиња ќе бидат преименувани. Лесно се заприметуваат таквите атрибути во релацијата R, на пр. **user(id) -> user_id** и **permission(name) -> permission_name**.
     4{{{
     5R(
     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
     271. {{{ user_id ->  username, description, password, registered_at, email, sex,is_active,name }}}
     28
     292. {{{ username -> user_id, description, password, registered_at, email, sex,is_active,name }}}
     30
     313. {{{ submission_id -> feedback_submission_type, feedback_created_at, feedback_description }}}
     32
     334. {{{ submission_id ->  submission_status, submission_created_at, submission_description }}}
     34
     355. {{{ {user_id,moderator_id, thread_id, blacklisted_start_date} ->  blacklisted_end_date, reason }}}
     36
     376. {{{ {thread_id, moderator_id} -> moderator_started_at }}}
     38
     397. {{{ thread_id -> thread_created_at, thread_content }}}
     40
     418. {{{ thread_id -> guidelines, topic_title, parent_id }}}
     42
     439. {{{ thread_id -> repo_url, project_title }}}
     44
     4510. {{{ {thread_id, user_id } -> asc_started_at, asc_ended_at }}}
     46
     4711. {{{ {thread_id, channel_name} ->  channel_description }}}
     48
     4912. {{{ resource_id -> channel_description, channel_name, thread_id }}}
     50
     5113. {{{ {thread_id, msg_send_at, user_id } -> msg_content }}}
     52
     5314. {{{ pr_id -> pr_name, pr_override_type }}}
     54
     5515. {{{ moderator_id -> user_id }}}
     56
     5716. {{{ parent_id -> thread_id }}}
     58
     5917. {{{ project_title -> repo_url, thread_id, thread_created_at, thread_content  }}}
     60
     6118. {{{ {parent_id, topic_title} -> guidelines, thread_id, thread_created_at, thread_content }}}
     62
     6319. {{{ {pr_name, thread_id} -> pr_override_type }}}
     64
     65=== Изведени ФЗ
     66
     671. {{{ resource_id -> thread_created_at, thread_content  }}}
     68
     692. {{{ resource_id -> guidelines, topic_title, parent_id  }}}
     70
     713. {{{  resource_id -> repo_url, project_title  }}}
     72
     734. {{{ moderator_id -> user_id }}}
     74
     755. {{{ 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
     1001. {{{ thread_id -> thread_id }}}
     1012. {{{ 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:
     1131. {{{ thread_id -> thread_id }}}
     1142. {{{ guideline -> guideline }}}
     1153. {{{ 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
     1241. X e супер клуч на R
     1252. А е примарен атрибут во 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} = {
     137user_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 }}}
     147R22(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