Əsas səhifə > MySQL administration > MySQL database normalization

MySQL database normalization

Database design-da advance mövzulardan biri də normalization və denormalization-dur.
Bu 2 teknik bir-birinə ziddir və hər birinin öz tərəfdarları var. Məsələn MySQL Users Group Azerbaijan-da olan bir fikir mübadiləsində
Wordpress-sin database arxitekturu haqqında danışıldı. Və gəlinən nəticəyə əsasən WordPress redundant data-larla dolu olan denormalize cədvəllərdən istifadə edir. Onlar çox böyük ehtimal ki bunu öz sistemlərinə uyğun hesab ediblər və ona uyğun öz spesifik optimization-larını aparıblar. Facebook məsələn normalize cədvəllərdən istifadə edir Facebook Database Schema
Bunu deməkdə məqsədim o idi ki, mütləq şəkildə normalization aparmaq deyə bir şey yoxdur. Özümüzə necə lazımdırsa elə də etməliyik.Hansı design bizə daha uyğundur ya yox onu artıq test etmək lazımdır.

İnternetdə bir sıra qaynaqlar var normalization-la bağlı mən terminlərə və.s girişmirəm. Bu yazının məqsədi sadə yolla bir cədvəli necə normalize etmək olar o haqdadır.
Nümunə cədvəlimiz belədir:

Puppy_number — id.
Puppy_name — ad.
Kennel_Code — yerləşdirildiyi yetişdirmə yurdu id-si.
Kennel_Name — yerləşdirildiyi yetişdirmə yurdu adı.
Kennel_location — yerləşdirildiyi yetişdirmə yurdu adresi.
Trick_ID — bacardığı tryuklar(Azərbaycanca bilmirəm nə deyim buna).
Trick_Name — tryuk adı.
Trick_Where_Learned — harda öyrənib.
Skill_Level — bacarıq dərəcəsi.

Normalization-nun 3 mərhələli şəkildə etmək məsləhət görülsə də mən şəxsən tapa bilmirəm ki konrket nə vaxt bilim ki 1NF(1 normal form) bitdi və yaxud 2NF hələ tam yerinə yetirilməyib və.s😉

Mənim ümumi oxuduqlarıma əsasən normalization sadəcə 1 cədvəli ona dəxlisi olmayan məlumatlardan azad etməkdir vəssəlam😉 Yəni cədvəli single-theme etmək…Yalnız bir-birilə sıx əlaqəli olan məlumatları orda saxlamaq

Əyani olaraq diqqət edək bizim cədvəl 4 ayrı hissələrdən ibarət görünür:

1.
Puppy_number
Puppy_name

2.
Kennel_Code
Kennel_Name
Kennel_location

3.
Trick_ID
Trick_Name

4.
Trick_Where_Learned
Skill_Level

Sübut: həqiqətən də puppy-nin yetişdirmə yurduna= kennel-ə, trick növlərinin də harda öyrənilməsinə dəxlisi yoxdur.

Denormalize cədvəlimiz:

create table puppies_trick(
p_id int not null, 
p_name varchar(25) not null,
k_code int not null,
k_name varchar(25) not null,
t_id int not null,
t_name varchar(25) not null,
t_where_learned varchar(25) not null,
skill_level int not null,
primary key(p_id,k_code,t_id)       
);

Və içindəki məlumat:

insert into puppies_trick() values(1,'Tibetian Mastiff',1,'Tibet Mastiff Success',1,'Catching Wolf','Tibet Mastiff Success',9);

Normalize edilmiş cədvəlimiz 4 hissəyə bölünüb:

create table puppies(
p_id int not null auto_increment,
p_name varchar(25) not null,
k_code int not null,
primary key(p_id),
index(k_code),
foreign key (k_code) references kennels(k_code) ON DELETE cascade ON UPDATE cascade
);


create table kennels(
k_code int not null auto_increment,
k_name varchar(25) not null,
k_location varchar(25) not null,
primary key(k_code),
index(k_location),
index(k_name)
);

create table tricks(
t_id int not null auto_increment,
t_name varchar(25) not null,
primary key(t_id,t_name)
);


create table puppy_tricks(
p_id int not null,
t_id int not null,
k_name varchar(25) not null,
skill_level int not null,
primary key(p_id),
index(t_id),
foreign key(p_id) references puppies(p_id) ON DELETE cascade ON UPDATE cascade,
foreign key(t_id) references tricks(t_id) ON DELETE cascade ON UPDATE cascade,
foreign key(k_name) references kennels(k_name) ON DELETE cascade ON UPDATE cascade
);

Və bu cədvəllərdə yerləşən məlumatlar:

insert into puppies() values(1,'Tibetian Mastiff',1);
insert into kennels() values(1,'Tibet Mastiff Success','Tibet');
insert into tricks() values(1,'Catching Wolf');
insert into puppy_tricks() values(1i,1,'Tibet Mastiff Success',9);

Məntiqlə belə düşünmək olar ki, əgər 1 ümumi və ona bərabər 4 cədvəl varsa select verdikdə eyni məlumatları almalıyıq. Bəli elədir:

-- Denormalize cədvəldən:
mysql> select p_name,k_name,t_name,skill_level from puppies_trick;
+------------------+-----------------------+---------------+-------------+
| p_name           | k_name                | t_name        | skill_level |
+------------------+-----------------------+---------------+-------------+
| Tibetian Mastiff | Tibet Mastiff Success | Catching Wolf |           9 |
+------------------+-----------------------+---------------+-------------+
1 row in set (0.00 sec)

-- Normalize cədvəllərdən:

mysql> select puppies.p_name,puppy_tricks.k_name,tricks.t_name,puppy_tricks.skill_level from puppy_tricks,tricks,puppies where puppy_tricks.t_id=tricks.t_id and puppy_tricks.p_id=puppies.p_id;
+------------------+-----------------------+---------------+-------------+
| p_name           | k_name                | t_name        | skill_level |
+------------------+-----------------------+---------------+-------------+
| Tibetian Mastiff | Tibet Mastiff Success | Catching Wolf |           9 |
+------------------+-----------------------+---------------+-------------+
1 row in set (0.00 sec)

Təbii ki bu bir elmi məqalə deyil və mən yazı üçün bir şeylər uyğunlaşdırıb yazdım. Sözsüz ki hansı cədvəlin performance cəhətdən özünü daha gözəl göstərəcəyini yalnız heavy load-da anlamaq olar.

Normalization haqqında ətraflı oxumaq üçün:
Overview of Normalization

Steps in Normalization

Təşəkürlər😉

  1. Hələlik heç bir şərh yoxdur
  1. No trackbacks yet.

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

%d bloqqer bunu bəyənir: