Changes between Version 5 and Version 6 of Normalization


Ignore:
Timestamp:
09/25/25 12:53:26 (3 weeks ago)
Author:
223270
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Normalization

    v5 v6  
    11== Нормализација на база и подобрување на дизајн
     2
     3=== Идентификувани проблеми-атрибути
     4Повеќевредносни (multivalued):
     5* destination.types_of_places
     6* destination.recommended_season
     7* meteorological_condition.weather_condition (ако може да има >1 состојба)
     8* meteorological_condition.warnings (можни повеќе warnings)
     9* activity.category (ако активноста може да има >1 категорија)
     10* preference.type_preference (ако корисникот може да има повеќе типови во една преференца)
     11* event.event_type (ако е повеќевредносно)
     12* users.phone_number (многу броеви по корисник)
     13
     14Сложени (composite / structured):
     15* destination.important_location_name + destination.important_location_description → important_locations (повеќе знаменитости по дестинација)
     16* loginName (во ЕР документација е сложен, но во реализација се користи users.first_name/last_name - нема посебна табела)
     17* package.duration — веќе разделен како start_date / end_date
     18
     19==== Справување со идентификувани проблеми
     20За секој multivalued атрибут: се креира associative (linking) table со две колони (id_parent, value).
     21
     22Ако вредностите се повторливи низ записи (naming taxonomy) — се креира референтна табела (категории/типови) + many-to-many. Така имаме единствен извор на вистината (lookup).
     23
     24{{{
     25CREATE TABLE IF NOT EXISTS destination_place_type (
     26    id_destination INT NOT NULL REFERENCES travel_sage.destination(id_destination) ON DELETE CASCADE,
     27    place_type VARCHAR(100) NOT NULL,
     28    PRIMARY KEY (id_destination, place_type)
     29);
     30
     31CREATE TABLE IF NOT EXISTS destination_season (
     32    id_destination INT NOT NULL REFERENCES travel_sage.destination(id_destination) ON DELETE CASCADE,
     33    season VARCHAR(50) NOT NULL,
     34    PRIMARY KEY (id_destination, season)
     35);
     36
     37CREATE TABLE IF NOT EXISTS user_phone (
     38    id_user INT NOT NULL REFERENCES travel_sage.users(id_user) ON DELETE CASCADE,
     39    phone_number VARCHAR(30) NOT NULL,
     40    PRIMARY KEY (id_user, phone_number)
     41);
     42
     43CREATE TABLE IF NOT EXISTS activity_category (
     44    id_activity INT NOT NULL REFERENCES travel_sage.activity(id_activity) ON DELETE CASCADE,
     45    category VARCHAR(100) NOT NULL,
     46    PRIMARY KEY (id_activity, category)
     47);
     48
     49CREATE TABLE IF NOT EXISTS event_type (
     50    id_event INT NOT NULL REFERENCES travel_sage.event(id_event) ON DELETE CASCADE,
     51    event_type VARCHAR(100) NOT NULL,
     52    PRIMARY KEY (id_event, event_type)
     53);
     54
     55CREATE TABLE IF NOT EXISTS preference_type (
     56    id_preference INT NOT NULL REFERENCES travel_sage.preference(id_preference) ON DELETE CASCADE,
     57    pref_type VARCHAR(100) NOT NULL,
     58    PRIMARY KEY (id_preference, pref_type)
     59);
     60
     61CREATE TABLE IF NOT EXISTS meteo_condition_value (
     62    id_meteo INT NOT NULL REFERENCES travel_sage.meteorological_condition(id_meteo) ON DELETE CASCADE,
     63    condition_value VARCHAR(100) NOT NULL,
     64    PRIMARY KEY (id_meteo, condition_value)
     65);
     66
     67CREATE TABLE IF NOT EXISTS meteo_warning_value (
     68    id_meteo INT NOT NULL REFERENCES travel_sage.meteorological_condition(id_meteo) ON DELETE CASCADE,
     69    warning_text VARCHAR(255) NOT NULL,
     70    PRIMARY KEY (id_meteo, warning_text)
     71);
     72
     73CREATE TABLE IF NOT EXISTS important_location (
     74    id_location SERIAL PRIMARY KEY,
     75    id_destination INT NOT NULL REFERENCES travel_sage.destination(id_destination) ON DELETE CASCADE,
     76    name VARCHAR(255) NOT NULL,
     77    description TEXT
     78);
     79}}}
     80
     81
    282=== Функциски зависности и нормализација
    3 
    483
    584Со цел да се постигне функционален и скалабилен дизајн на базата на податоци за веб-апликацијата TravelSage, започнав со обединета релација која ги содржи сите атрибути од моделот. Оваа релација служи како почетна точка за анализа на функционалните зависности. Врз основа на таа анализа, се применува нормализација до третата нормална форма (3НФ), при што секој чекор вклучува логичка декомпозиција на релациите со цел да се избегнат вишоци, аномалии при ажурирање и несоодветни зависности.