Changes between Initial Version and Version 1 of Normalization


Ignore:
Timestamp:
04/20/26 18:35:56 (2 weeks ago)
Author:
233062
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v1 v1  
     1Нормализација
     2== Де-нормализирана база на податоци
     3
     4Се тргнува од една глобална, де-нормализирана релација што ги содржи атрибутите од целиот модел:
     5
     6R = { user_id, email, username, password, training_user_id, training_gender, training_age, training_weight, training_id, training_date, training_type, training_duration, training_calories, investor_user_id, asset_id, asset_ticker_symbol, asset_buy_price, asset_buy_date, asset_quantity, weight_user_id, weight_current, weight_height, weight_goal_weight, weight_goal_calories, daily_intake_id, daily_intake_date, daily_intake_calories, discipline_user_id, custom_tracking_id, custom_tracking_name, task_id, task_name, task_finished, daily_completion_id, daily_completion_date, daily_completion_percent, finance_user_id, finance_spending_budget, finance_saving_budget, finance_investing_budget, finance_donation_budget, finance_credit, income_id, income_date, income_amount }
     7
     8Оваа релација е де-нормализирана затоа што содржи повторливи групи, како и зависности од атрибути што не се клуч.
     9
     10== Функционални зависности:
     11
     12FD1: user_id -> email, username, password
     13FD2: email -> user_id, username, password
     14FD3: username -> user_id, email, password
     15FD4: training_user_id -> training_gender, training_age, training_weight
     16FD5: training_id -> training_user_id, training_date, training_type, training_duration, training_calories
     17FD6: investor_user_id -> user_id
     18FD7: asset_id -> investor_user_id, asset_ticker_symbol, asset_buy_price, asset_buy_date, asset_quantity
     19FD8: weight_user_id -> weight_current, weight_height, weight_goal_weight, weight_goal_calories
     20FD9: daily_intake_id -> weight_user_id, daily_intake_date, daily_intake_calories
     21FD10: discipline_user_id -> user_id
     22FD11: custom_tracking_id -> user_id, custom_tracking_name
     23FD12: task_id -> discipline_user_id, custom_tracking_id, task_name, task_finished
     24FD13: daily_completion_id -> user_id, daily_completion_date, daily_completion_percent
     25FD14: (task_id, daily_completion_id) -> /
     26FD15: finance_user_id -> finance_spending_budget, finance_saving_budget, finance_investing_budget, finance_donation_budget, finance_credit
     27FD16: income_id -> finance_user_id, income_date, income_amount
     28Леви и десен дел:
     29
     30Леви: user_id, email, username, training_user_id, training_id, investor_user_id, asset_id, weight_user_id, daily_intake_id, discipline_user_id, custom_tracking_id, task_id, daily_completion_id, finance_user_id, income_id
     31Десен: password, training_gender, training_age, training_weight, training_date, training_type, training_duration, training_calories, asset_ticker_symbol, asset_buy_price, asset_buy_date, asset_quantity, weight_current, weight_height, weight_goal_weight, weight_goal_calories, daily_intake_date, daily_intake_calories, custom_tracking_name, task_name, task_finished, daily_completion_date, daily_completion_percent, finance_spending_budget, finance_saving_budget, finance_investing_budget, finance_donation_budget, finance_credit, income_date, income_amount
     32Леви и десен дел:
     33
     34user_id, training_user_id, training_id, investor_user_id, asset_id, weight_user_id, daily_intake_id, discipline_user_id, custom_tracking_id, task_id, daily_completion_id, finance_user_id, income_id
     35== Глобална релација
     36
     37R = { user_id, email, username, password, training_user_id, training_gender, training_age, training_weight, training_id, training_date, training_type, training_duration, training_calories, investor_user_id, asset_id, asset_ticker_symbol, asset_buy_price, asset_buy_date, asset_quantity, weight_user_id, weight_current, weight_height, weight_goal_weight, weight_goal_calories, daily_intake_id, daily_intake_date, daily_intake_calories, discipline_user_id, custom_tracking_id, custom_tracking_name, task_id, task_name, task_finished, daily_completion_id, daily_completion_date, daily_completion_percent, finance_user_id, finance_spending_budget, finance_saving_budget, finance_investing_budget, finance_donation_budget, finance_credit, income_id, income_date, income_amount }
     38
     39== Покривачи
     40
     41user_id+ = { user_id, email, username, password } -> не ги содржи сите атрибути
     42training_user_id+ = { training_user_id, training_gender, training_age, training_weight } -> не ги содржи сите атрибути
     43training_id+ = { training_id, training_user_id, training_date, training_type, training_duration, training_calories } -> не ги содржи сите атрибути
     44investor_user_id+ = { investor_user_id, user_id } -> не ги содржи сите атрибути
     45asset_id+ = { asset_id, investor_user_id, asset_ticker_symbol, asset_buy_price, asset_buy_date, asset_quantity } -> не ги содржи сите атрибути
     46weight_user_id+ = { weight_user_id, weight_current, weight_height, weight_goal_weight, weight_goal_calories } -> не ги содржи сите атрибути
     47daily_intake_id+ = { daily_intake_id, weight_user_id, daily_intake_date, daily_intake_calories } -> не ги содржи сите атрибути
     48discipline_user_id+ = { discipline_user_id, user_id } -> не ги содржи сите атрибути
     49custom_tracking_id+ = { custom_tracking_id, user_id, custom_tracking_name } -> не ги содржи сите атрибути
     50task_id+ = { task_id, discipline_user_id, custom_tracking_id, task_name, task_finished } -> не ги содржи сите атрибути
     51daily_completion_id+ = { daily_completion_id, user_id, daily_completion_date, daily_completion_percent } -> не ги содржи сите атрибути
     52finance_user_id+ = { finance_user_id, finance_spending_budget, finance_saving_budget, finance_investing_budget, finance_donation_budget, finance_credit } -> не ги содржи сите атрибути
     53income_id+ = { income_id, finance_user_id, income_date, income_amount } -> не ги содржи сите атрибути
     54{task_id, daily_completion_id}+ = { task_id, daily_completion_id } -> не ги содржи сите атрибути
     55== Спојување покривачи
     56
     57Бидејќи атрибутите што се појавуваат само на левата страна не можат да се изведат на друг начин, тие мора да бидат дел од примарниот клуч.
     58
     59Земајќи ги сите леви атрибути заедно, добиваме минимален суперклуч:
     60
     61{ user_id, training_user_id, training_id, investor_user_id, asset_id, weight_user_id, daily_intake_id, discipline_user_id, custom_tracking_id, task_id, daily_completion_id, finance_user_id, income_id }
     62
     63Во нашата нормализирана конструкција, ова е теоретскиот глобален кандидат-ключ на де-нормализираната релација.
     64
     65Избран примарен клуч: { user_id, training_user_id, training_id, investor_user_id, asset_id, weight_user_id, daily_intake_id, discipline_user_id, custom_tracking_id, task_id, daily_completion_id, finance_user_id, income_id }
     66
     67== Проверка за 1НФ
     68
     69Бидејќи релацијата содржи повторливи групи и неатомски листи во де-нормализираниот поглед, не ја задоволува 1НФ.
     70
     71== Декомпозиција по 1НФ
     72
     73Релација што се анализира
     74R
     75
     76Проблем
     77Лист атрибутите и повторливите групи не се атомски.
     78
     79Прва декомпозиција
     80TASKS(task_id, discipline_user_id, custom_tracking_id, task_name, task_finished)
     81TASK_DAILY_COMPLETION(task_id, daily_completion_id)
     82Резултат
     83Се добиваат атомски вредности и релации со локални клучеви.
     84
     85== Проверка за 2НФ
     86
     87R не ја задоволува 2НФ поради парцијални зависности, на пример:
     88
     89user_id -> email, username, password
     90training_user_id -> training_gender, training_age, training_weight
     91asset_id -> asset_ticker_symbol, asset_buy_price, asset_buy_date, asset_quantity
     92== Декомпозиција по 2НФ
     93
     94Атрибутите се групираат според тоа од кој клуч зависат:
     95
     96USERS(user_id, email, username, password)
     97TRAINING_USERS(user_id, gender, age, weight)
     98TRAINING_SESSIONS(training_id, training_user_id, date, type, duration, calories)
     99INVESTOR_USERS(user_id)
     100ASSETS(asset_id, user_id, ticker_symbol, buy_price, buy_date, quantity)
     101WEIGHT_USERS(user_id, weight, height, goal_weight, goal_calories)
     102DAILY_INTAKES(daily_intake_id, user_id, date, calories)
     103DISCIPLINE_USERS(user_id)
     104CUSTOM_TRACKING_CATEGORIES(custom_tracking_id, user_id, name)
     105TASKS(task_id, discipline_user_id, custom_tracking_id, task_name, task_finished)
     106DAILY_COMPLETION(daily_completion_id, user_id, date, procent)
     107TASK_DAILY_COMPLETION(task_id, daily_completion_id)
     108FINANCE_USERS(user_id, spending_budget, saving_budget, investing_budget, donation_budget, credit)
     109INCOMES(income_id, user_id, date, amount)
     110== Проверка за 3НФ
     111
     112Ги разгледуваме релациите добиени по 2НФ.
     113
     114Проблематични транзитивни/изведени атрибути се:
     115
     116num_tasks
     117tasks
     118weight_user_id во TRAINING_SESSIONS како непотребна зависност за оваа верзија на моделот
     119== Декомпозиција по 3НФ
     120
     121DISCIPLINE_USERS(user_id) -> се задржува само идентификаторот што ја врзува дисциплинската улога со USERS.
     122
     123CUSTOM_TRACKING_CATEGORIES(custom_tracking_id, user_id, name) -> се задржува само името на категоријата, без броење и листи на задачи.
     124
     125TRAINING_SESSIONS(training_id, training_user_id, date, type, duration, calories) -> сесијата се врзува само со training_user_id.
     126
     127Резултат
     128Нема не-клучен атрибут што зависи од друг не-клучен атрибут во истата релација.
     129
     130== Проверка за БКНФ
     131
     132Сите добиени релации се во БКНФ, бидејќи секој детерминант е кандидат-ключ во својата релација.
     133
     134Особено:
     135
     136USERS ги задржува алтернативните клучеви email и username
     137TASK_DAILY_COMPLETION(task_id, daily_completion_id) е спојна релација без не-клучни атрибути
     138профилните релации со user_id се чисти 1:1 продолжувања на USERS
     139== Финален резултат и дискусија
     140
     141== Нормализиран релациски модел
     142
     143Финалниот модел што го користиме во тековната имплементација е:
     144
     145USERS
     146TRAINING_USERS
     147TRAINING_SESSIONS
     148INVESTOR_USERS
     149ASSETS
     150WEIGHT_USERS
     151DAILY_INTAKES
     152DISCIPLINE_USERS
     153CUSTOM_TRACKING_CATEGORIES
     154TASKS
     155DAILY_COMPLETION
     156TASK_DAILY_COMPLETION
     157FINANCE_USERS
     158INCOMES
     159== Дискусија
     160
     161Разлики во однос на претходниот дизајн:
     162
     163Се отстранети num_tasks и tasks од дисциплинските табели.
     164Се отстранета непотребната релација weight_user_id од TRAINING_SESSIONS.
     165Се задржуваат профилните табели со user_id како заеднички примарен и странски клуч.
     166Одлука за следните фази:
     167
     168Овој нормализиран модел останува извор на вистина.
     169API форматот може да остане стабилен, додека внатрешната шема е нормализирана.
     170DDL и DML скриптите треба да ја следат оваа шема.