ТОРА (9) - Лекция №3 - Хорошая схема БД - Соединение без потерь: различия между версиями

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество
Перейти к навигации Перейти к поиску
м (→‎Доказательство: подробнее)
 
(не показано 27 промежуточных версий 6 участников)
Строка 1: Строка 1:
== Алгоритм построение условно-неизбыточного покрытия ==
Пусть {{Формула|f=F}} и {{Формула|f=G}} - два множества ФЗ.


1) если в множестве ФЗ <math>F</math> встречаются ФЗ с одинаковой левой частью <math>X</math>, то следует объединить эти ФЗ в одну ФЗ. Это следует из аксиомы объединения. Получившееся множество ФЗ обозначим <math>G</math>;
{{Формула|f=G}} называется ''покрытием'' {{Формула|f=F}}, если имеет место равенство {{Формула|f=G^+ = F^+}}


2) для каждой ФЗ <math>X\rightarrow Y</math> из <math>G</math> заменить её на <math>X\rightarrow X^+ - X</math>;
Существуют различные виды покрытий. Но мы рассмотрим только один - ''условно-неизбыточное покрытие''.


После выполнения 1) и 2) получаем замыкание <math>G^+ = F</math>
== Алгоритм построения условно-неизбыточного покрытия ==
 
1) если в множестве ФЗ {{Формула|f=F}} встречаются ФЗ с одинаковой левой частью {{Формула|f=X}}, то следует объединить эти ФЗ в одну ФЗ. Это следует из леммы объединения. Получившееся множество ФЗ обозначим {{Формула|f=G}};
 
2) для каждой ФЗ {{Формула|f=X\rightarrow Y}} из {{Формула|f=G}} заменить её на {{Формула|f=X\rightarrow X^+ - X}};
 
После выполнения 1) и 2) получаем замыкание {{Формула|f=G^+ = F^+}}


=== Доказательство ===
=== Доказательство ===


1) если ФЗ <math>X\rightarrow Y\in F</math>, то эта ФЗ принадежит <math>G^+</math>, а из этого следует, что <math>Y \subseteq X^+</math>
1)


По построению G имеет место ФЗ: <math>X\rightarrow X^+ - X</math>
:Докажем, что если ФЗ {{Формула|f=X\rightarrow Y\in F}} (из этого следует, что {{Формула|f=Y \subseteq X^+}} (1) по определению замыкания множества аттрибутов), то эта ФЗ принадежит {{Формула|f=G^+}}


Пополним эту ФЗ: <math>X\rightarrow (X^+ - X)\bigcup X = X^+</math>
:По построению {{Формула|f=G}} имеет место ФЗ: {{Формула|f=X\rightarrow X^+ - X}} (2)


Теперь по первой аксиоме Армстронга имеем <math>X^+\rightarrow Y</math>
:Пополним эту ФЗ: {{Формула|f=X\rightarrow (X^+ - X)\bigcup X}}, получится, что {{Формула|f=X\rightarrow X^+}} (3)


Значит, <math>X\rightarrow Y \in G^+</math>, по третьей аксиоме Армстронга.
:Теперь по первой аксиоме Армстронга из (1) имеем {{Формула|f=X^+\rightarrow Y}} (4)


2) <math>X\rightarrow Y \in G</math>, <math>X\rightarrow Y \in F^+</math>
:Значит, {{Формула|f=X\rightarrow Y \in G^+}}, по третьей аксиоме Армстронга, исходя из (3) и (4).


<math>Y = X^+ - X</math>
2)


<math>X\rightarrow X^+</math> (по определению)
:Докажем обратное, что если {{Формула|f=X\rightarrow Y \in G}}, то {{Формула|f=X\rightarrow Y \in F^+}}


<math>X^+\rightarrow X^+ - X</math> (1 аксиома Армстронга)
:По построению {{Формула|f=G}} имеем: {{Формула|f=Y = X^+ - X}} (5)


<math>X^+\rightarrow X^+ - X = Y</math> (3 аксимома Армстронга)
: Для {{Формула|f=F}} имеем:
:: {{Формула|f=X\rightarrow X^+}} (по определению) (6)
:: {{Формула|f=X^+\rightarrow X^+ - X}} (1 аксиома Армстронга, так как {{Формула|f=X^+ - X\subseteq X^+}}) (7)
:: {{Формула|f=X\rightarrow X^+ - X = Y}} (3 аксимома Армстронга из (6)и (7), и по равенству (5))


<math>X^+\rightarrow Y \in F^+</math>
:В итоге получили {{Формула|f=X\rightarrow Y \in F^+}}.
 
Теорема доказана.


=== Пример ===
=== Пример ===


УСО: <math>R = (A, B, C)</math>
УСО: {{Формула|f=R = (A, B, C)}}
 
Множество ФЗ: {{Формула|f=F = (A\rightarrow B, B\rightarrow A, C\rightarrow A, A\rightarrow C, B\rightarrow C)}}


Множество ФЗ: <math>F = (A\rightarrow B, B\rightarrow A, C\rightarrow A, A\rightarrow C, B\rightarrow C)</math>
1)


1) <math>G = (A\rightarrow BC, B\rightarrow AC, C\rightarrow A</math>
:{{Формула|f=G = (A\rightarrow BC, B\rightarrow AC, C\rightarrow A)}}


2)
2)


<math>A^+ = ABC</math>, <math>A^+ - A = BC</math>
:{{Формула|f=A^+ = ABC}}, {{Формула|f=A^+ - A = BC}}


<math>B^+ = BAC</math>, <math>B^+ - B = AC</math>
:{{Формула|f=B^+ = BAC}}, {{Формула|f=B^+ - B = AC}}


<math>C^+ = CAB</math>, <math>C^+ - C = AB</math>
:{{Формула|f=C^+ = CAB}}, {{Формула|f=C^+ - C = AB}}




Тогда <math>G = (A\rightarrow BC, B\rightarrow AC, C\rightarrow AB)</math> будет являться УНП.
Тогда {{Формула|f=G = (A\rightarrow BC, B\rightarrow AC, C\rightarrow AB)}} будет являться УНП.


== Свойства "хорошей" схемы БД ==
== Свойства "хорошей" схемы БД ==
Строка 63: Строка 76:
=== Соединение без потерь ===
=== Соединение без потерь ===


Пусть <math>\rho = (R_1 ... R_n)</math> - схема БД. Она будет обладать свойствоем соединения без потерь, если для любого экземпляра отношения <math>r</math> из <math>R</math> справедливо равенство: <math>r = \Pi_{R_1}(r) \bowtie \Pi_{R_2}(r) \bowtie ... \bowtie \Pi_{R_n}(r)</math>, где <math>\Pi_{R_i}(r)</math> - это проекция экземпляра отношения <math>r</math> на множество атрибутов <math>R_i</math>
Чтобы схема БД обладала свойством соединения без потерь, необходимо, чтобы хотя бы одна из таблиц содержала ключ универсальной схемы отношений.
 
Пусть {{Формула|f=\rho = (R_1 ... R_n)}} - схема БД. Она будет обладать свойством соединения без потерь, если для любого экземпляра отношения {{Формула|f=r}} из {{Формула|f=R}} справедливо равенство: {{Формула|f=r = \Pi_{R_1}(r) \bowtie \Pi_{R_2}(r) \bowtie ... \bowtie \Pi_{R_n}(r)}}, где {{Формула|f=\Pi_{R_i}(r)}} - это проекция экземпляра отношения {{Формула|f=r}} на множество атрибутов {{Формула|f=R_i}}


==== Пример БД, не обладающей свойством соединения без потерь ====
==== Пример БД, не обладающей свойством соединения без потерь ====


<math>R = (A, B, C)</math>
{{Формула|f=R = (A, B, C)}}


<math>\rho = (AB, BC) = (R_1, R_2)</math>
{{Формула|f=\rho = (AB, BC) = (R_1, R_2)}}


<math>F = (A\rightarrow B)</math>
{{Формула|f=F = (A\rightarrow B)}}


Достаточно привести пример экземпляра <math>r</math>, для которого равенство не выполняется:
Достаточно привести пример экземпляра {{Формула|f=r}}, для которого равенство не выполняется:


{| class="wikitable"
{| class="wikitable"
  ! !! A !! B !! C
  ! !! A !! B !! C
  |- align="center"
  |- align="center"
  | rowspan="2" | <math>r</math> || <math>a_1</math> || <math>b_1</math> || <math>c_1</math>
  | rowspan="2" | {{Формула|f=r}} || {{Формула|f=a_1}} || {{Формула|f=b_1}} || {{Формула|f=c_1}}
  |- align="center"
  |- align="center"
  | <math>a_2</math> || <math>b_1</math> || <math>c_2</math>
  | {{Формула|f=a_2}} || {{Формула|f=b_1}} || {{Формула|f=c_2}}
  |}
  |}
   
   
Строка 88: Строка 103:
  ! !! A !! B
  ! !! A !! B
  |- align="center"
  |- align="center"
  | rowspan="2" | <math>\Pi_{R_1}(r)</math> || <math>a_1</math> || <math>b_1</math>
  | rowspan="2" | {{Формула|f=\Pi_{R_1}(r)}} || {{Формула|f=a_1}} || {{Формула|f=b_1}}
  |- align="center"
  |- align="center"
  | <math>a_2</math> || <math>b_1</math>
  | {{Формула|f=a_2}} || {{Формула|f=b_1}}
  |}
  |}
  |
  |
Строка 96: Строка 111:
  |
  |
{| class="wikitable"
{| class="wikitable"
  ! !! A !! B
  ! !! В !! С
  |- align="center"
  |- align="center"
  | rowspan="2" | <math>\Pi_{R_2}(r)</math> || <math>b_1</math> || <math>c_1</math>
  | rowspan="2" | {{Формула|f=\Pi_{R_2}(r)}} || {{Формула|f=b_1}} || {{Формула|f=c_1}}
  |- align="center"
  |- align="center"
  | <math>b_1</math> || <math>c_2</math>
  | {{Формула|f=b_1}} || {{Формула|f=c_2}}
  |}
  |}
|}
|}


Полученное соединение не будет равняться <math>r</math>:
Полученное соединение не будет равняться {{Формула|f=r}}:


{| class="wikitable"
{| class="wikitable"
  ! !! A !! B !! C
  ! !! A !! B !! C
  |- align="center"
  |- align="center"
  | rowspan="4" | <math>\Pi_{R_1}(r) \bowtie \Pi_{R_2}(r)</math> || <math>a_1</math> || <math>b_1</math> || <math>c_1</math>
  | rowspan="4" | {{Формула|f=\Pi_{R_1}(r) \bowtie \Pi_{R_2}(r)}} || {{Формула|f=a_1}} || {{Формула|f=b_1}} || {{Формула|f=c_1}}
  |- align="center" bgcolor="red"
  |- align="center" bgcolor="#FFB6C1"
  | <math>a_1</math> || <math>b_1</math> || <math>c_2</math>
  | {{Формула|f=a_1}} || {{Формула|f=b_1}} || {{Формула|f=c_2}}
  |- align="center" bgcolor="red"
  |- align="center" bgcolor="#FFB6C1"
  | <math>a_2</math> || <math>b_1</math> || <math>c_1</math>
  | {{Формула|f=a_2}} || {{Формула|f=b_1}} || {{Формула|f=c_1}}
  |- align="center"
  |- align="center"
  | <math>a_2</math> || <math>b_1</math> || <math>c_2</math>
  | {{Формула|f=a_2}} || {{Формула|f=b_1}} || {{Формула|f=c_2}}
  |}
  |}
   
   
Строка 122: Строка 137:
==== Пример БД, обладающей свойством соединения без потерь ====
==== Пример БД, обладающей свойством соединения без потерь ====


<math>R = (A, B, C)</math>
{{Формула|f=R = (A, B, C)}}


<math>\rho = (AB, AC) = (R_1, R_2)</math>
{{Формула|f=\rho = (AB, AC) = (R_1, R_2)}}


<math>F = (A\rightarrow B)</math>
{{Формула|f=F = (A\rightarrow B)}}


Возьмём тот же экземпляр:
Возьмём тот же экземпляр:
Строка 133: Строка 148:
  ! !! A !! B !! C
  ! !! A !! B !! C
  |- align="center"
  |- align="center"
  | rowspan="2" | <math>r</math> || <math>a_1</math> || <math>b_1</math> || <math>c_1</math>
  | rowspan="2" | {{Формула|f=r}} || {{Формула|f=a_1}} || {{Формула|f=b_1}} || {{Формула|f=c_1}}
  |- align="center"
  |- align="center"
  | <math>a_2</math> || <math>b_1</math> || <math>c_2</math>
  | {{Формула|f=a_2}} || {{Формула|f=b_1}} || {{Формула|f=c_2}}
  |}
  |}


Строка 143: Строка 158:
  ! !! A !! B
  ! !! A !! B
  |- align="center"
  |- align="center"
  | rowspan="2" | <math>\Pi_{R_1}(r)</math> || <math>a_1</math> || <math>b_1</math>
  | rowspan="2" | {{Формула|f=\Pi_{R_1}(r)}} || {{Формула|f=a_1}} || {{Формула|f=b_1}}
  |- align="center"
  |- align="center"
  | <math>a_2</math> || <math>b_1</math>
  | {{Формула|f=a_2}} || {{Формула|f=b_1}}
  |}
  |}
  |
  |
Строка 151: Строка 166:
  |
  |
{| class="wikitable"
{| class="wikitable"
  ! !! A !! B
  ! !! A !! С
  |- align="center"
  |- align="center"
  | rowspan="2" | <math>\Pi_{R_2}(r)</math> || <math>a_1</math> || <math>c_1</math>
  | rowspan="2" | {{Формула|f=\Pi_{R_2}(r)}} || {{Формула|f=a_1}} || {{Формула|f=c_1}}
  |- align="center"
  |- align="center"
  | <math>a_2</math> || <math>c_2</math>
  | {{Формула|f=a_2}} || {{Формула|f=c_2}}
  |}
  |}
|}
|}
   
   
Полученное соединение будет равняться <math>r</math>:
Полученное соединение будет равняться {{Формула|f=r}}:


{| class="wikitable"
{| class="wikitable"
  ! !! A !! B !! C
  ! !! A !! B !! C
  |- align="center"
  |- align="center"
  | rowspan="2" | <math>\Pi_{R_1}(r) \bowtie \Pi_{R_2}(r)</math> || <math>a_1</math> || <math>b_1</math> || <math>c_1</math>
  | rowspan="2" | {{Формула|f=\Pi_{R_1}(r) \bowtie \Pi_{R_2}(r)}} || {{Формула|f=a_1}} || {{Формула|f=b_1}} || {{Формула|f=c_1}}
  |- align="center"
  |- align="center"
  | <math>a_2</math> || <math>b_1</math> || <math>c_2</math>
  | {{Формула|f=a_2}} || {{Формула|f=b_1}} || {{Формула|f=c_2}}
|}
|}
   
   
Строка 173: Строка 188:
==== Алгоритм проверки схемы БД на свойство соединения без потерь ====
==== Алгоритм проверки схемы БД на свойство соединения без потерь ====
   
   
<math>\rho = (R_1 ... R_n)</math>
{{Формула|f=\rho = (R_1 ... R_n)}}
   
   
<math>R = (A_1 ... A_n)</math>
{{Формула|f=R = (A_1 ... A_n)}}
   
   
1) построить таблицу T:
1) построить таблицу T:
   
   
{| class="wikitable"
{| class="wikitable"
  ! !! <math>A_1</math> || <math>A_2</math> || ... || <math>A_k</math>
  ! !! {{Формула|f=A_1}} || {{Формула|f=A_2}} || ... || {{Формула|f=A_k}}
  |- align="center"
  |- align="center"
  | <math>R_1</math> || || || ||
  ! {{Формула|f=R_1}}
| || || ||
  |- align="center"
  |- align="center"
  | <math>R_2</math> || || || ||
  ! {{Формула|f=R_2}}
| || || ||
  |- align="center"
  |- align="center"
  | ... || || || ||
  ! ...
| || || ||
  |- align="center"
  |- align="center"
  | <math>R_n</math> || || || ||
  ! {{Формула|f=R_n}}
| || || ||
  |}
  |}
    
    
И заполнить таблицу T по правилу: если <math>A_j \in R_i</math>, то <math>T_{ij}=a</math>, иначе <math>T_{ij}=b_i</math>
И заполнить таблицу T по правилу: если {{Формула|f=A_j \in R_i}}, то {{Формула|f=T_{ij}=a}}, иначе {{Формула|f=T_{ij}=b_i}}


2) изменить таблицу T - циклически просматривать ФЗ из <math>F</math> в любом порядке, и для очередной ФЗ <math>X\rightarrow Y \in F</math> выполнить следующие действия:
2) изменить таблицу T - циклически просматривать ФЗ из {{Формула|f=F}} в любом порядке, и для очередной ФЗ {{Формула|f=X\rightarrow Y \in F}} выполнить следующие действия:
* найти в таблице T строки, совпадающие по атрибутам <math>X</math> (по левой части);
* найти в таблице T строки, совпадающие по атрибутам {{Формула|f=X}} (по левой части);
* если хотя бы в одной такой строке значение атрибута <math>A_m \in Y = a</math>, то во всех найденных строках присвоить <math>A_m = a</math>, иначе присвоить <math>A_m = b_i</math> (<math>i</math> - номер одной из найденных строк, <math>b_i</math> должно быть одинаково во всех указанных строках);
* если хотя бы в одной такой строке значение атрибута {{Формула|f=A_m \in Y = a}}, то во всех найденных строках присвоить {{Формула|f=A_m = a}}, иначе присвоить {{Формула|f=A_m = b_i}} ({{Формула|f=i}} - номер одной из найденных строк), {{Формула|f=b_i}} должно быть одинаково во всех указанных строках);
* выполнить предыдущие два пункта для всех атрибутов <math>A_l \in Y</math>;
* выполнить предыдущие два пункта для всех атрибутов {{Формула|f=A_l \in Y}};
* выполнить предыдущие три пункта для всех ФЗ из <math>F</math>, циклически их просматривая.
* выполнить предыдущие три пункта для всех ФЗ из {{Формула|f=F}}, циклически их просматривая.


3) алгоритм останавливается, если при очередном просмотре ФЗ из <math>F</math>:
3) алгоритм останавливается, если при очередном просмотре ФЗ из {{Формула|f=F}}:
* не произошло никаких изменений в таблице T;
* не произошло никаких изменений в таблице T;
* какая-нибудь строка в T не стала состоять сплошь из символов <math>a</math> (наличие такой строки и говорит о выполнении свойства соединения без потерь).
* какая-нибудь строка в T не стала состоять сплошь из символов {{Формула|f=a}} (наличие такой строки и говорит о выполнении свойства соединения без потерь).


===== Пример =====
===== Пример =====


Пусть <math>R = (A, B, C)</math>
Пусть {{Формула|f=R = (A, B, C)}}


<math>\rho = (AB, AC) = (R_1, R_2)</math>
{{Формула|f=\rho = (AB, AC) = (R_1, R_2)}}


<math>F = (A\rightarrow B)</math>
{{Формула|f=F = (A\rightarrow B)}}


Доказать, что <math>\rho</math> обладает свойством соединения без потерь.
Доказать, что {{Формула|f=\rho}} обладает свойством соединения без потерь.


1)
1)
Строка 219: Строка 238:
  |- align="center"
  |- align="center"
  ! AB
  ! AB
  | <math>a</math> || <math>a</math> || <math>b_1</math>
  | {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=b_1}}
  |- align="center"
  |- align="center"
  ! BC
  ! AC
  | <math>a</math> || <math>b_2</math> || <math>a</math>
  | {{Формула|f=a}} || {{Формула|f=b_2}} || {{Формула|f=a}}
  |}
  |}


Строка 233: Строка 252:
  |- align="center"
  |- align="center"
  ! AB
  ! AB
  | <math>a</math> || <math>a</math> || <math>b_1</math>
  | {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=b_1}}
  |- align="center"
  |- align="center"
  ! BC
  ! AC
  | <math>a</math> || <math>b_2</math> || <math>a</math>
  | {{Формула|f=a}} || {{Формула|f=b_2}} || {{Формула|f=a}}
  |}
  |}
  |
  |
Строка 245: Строка 264:
  |- align="center"
  |- align="center"
  ! AB
  ! AB
  | <math>a</math> || <math>a</math> || <math>b_1</math>
  | {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=b_1}}
  |- align="center"
  |- align="center"
  ! BC
  ! AC
  | <math>a</math> || bgcolor="lime" | <math>a</math> || <math>a</math>
  | {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}} || {{Формула|f=a}}
  |}
  |}
|}
|}
    
    
Получили строку, сплошь состоящую из <math>a</math>. Значит <math>\rho</math> обладает свойством соединения без потерь.
Получили строку, сплошь состоящую из {{Формула|f=a}}. Значит {{Формула|f=\rho}} обладает свойством соединения без потерь.
 
===== Другой пример =====
===== Другой пример =====
   
   
Пусть <math>R = (A, B, C, D, E, F, P, S)</math>
Пусть {{Формула|f=R = (A, B, C, D, E, F, P, S)}}
   
   
<math>\rho = (AB, ACDPS, BCPS, DEF) = (R_1, R_2, R_3, R_4)</math>
{{Формула|f=\rho = (AB, ACDPS, BCPS, DEF) = (R_1, R_2, R_3, R_4)}}
   
   
<math>F = (B\rightarrow C, D\rightarrow EF, B\rightarrow PS, A\rightarrow CDPS, AP\rightarrow S)</math>
{{Формула|f=F = (B\rightarrow C, D\rightarrow EF, B\rightarrow PS, A\rightarrow CDPS, AP\rightarrow S)}}


Доказать, что <math>\rho</math> обладает свойством соединения без потерь.
Доказать, что {{Формула|f=\rho}} обладает свойством соединения без потерь.
   
   
1)
1)
Строка 270: Строка 289:
  |- align="center"
  |- align="center"
  ! AB
  ! AB
  | <math>a</math> || <math>a</math> || <math>b_1</math> || <math>b_1</math> || <math>b_1</math> || <math>b_1</math> || <math>b_1</math> || <math>b_1</math>
  | {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=b_1}} || {{Формула|f=b_1}} || {{Формула|f=b_1}} || {{Формула|f=b_1}} || {{Формула|f=b_1}} || {{Формула|f=b_1}}
  |- align="center"
  |- align="center"
  ! ACDPS
  ! ACDPS
  | <math>a</math> || <math>b_2</math> || <math>a</math> || <math>a</math> || <math>b_2</math> || <math>b_2</math> || <math>a</math> || <math>a</math>
  | {{Формула|f=a}} || {{Формула|f=b_2}} || {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=b_2}} || {{Формула|f=b_2}} || {{Формула|f=a}} || {{Формула|f=a}}
  |- align="center"
  |- align="center"
  ! BCPS
  ! BCPS
  | <math>b_3</math> || <math>a</math> || <math>a</math> || <math>b_3</math> || <math>b_3</math> || <math>b_3</math> || <math>a</math> || <math>a</math>
  | {{Формула|f=b_3}} || {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=b_3}} || {{Формула|f=b_3}} || {{Формула|f=b_3}} || {{Формула|f=a}} || {{Формула|f=a}}
  |- align="center"
  |- align="center"
  ! DEF
  ! DEF
  | <math>b_4</math> || <math>b_4</math> || <math>b_4</math> || <math>a</math> || <math>a</math> || <math>a</math> || <math>b_4</math> || <math>b_4</math>
  | {{Формула|f=b_4}} || {{Формула|f=b_4}} || {{Формула|f=b_4}} || {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=b_4}} || {{Формула|f=b_4}}
  |}
  |}
   
   
Строка 290: Строка 309:
  |- align="center"
  |- align="center"
  ! AB
  ! AB
  | <math>a</math> || <math>a</math> || bgcolor="lime" | <math>a</math> || bgcolor="lime" | <math>a</math> || <math>b_1</math> || <math>b_1</math> || bgcolor="lime" | <math>a</math> || bgcolor="lime" | <math>a</math>
  | {{Формула|f=a}} || {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}} || {{Формула|f=b_1}} || {{Формула|f=b_1}} || bgcolor="lime" | {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}}
  |- align="center"
  |- align="center"
  ! ACDPS
  ! ACDPS
  | <math>a</math> || <math>b_2</math> || <math>a</math> || <math>a</math> || bgcolor="lime" | <math>a</math> || bgcolor="lime" | <math>a</math> || <math>a</math> || <math>a</math>
  | {{Формула|f=a}} || {{Формула|f=b_2}} || {{Формула|f=a}} || {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=a}}
  |- align="center"
  |- align="center"
  ! BCPS
  ! BCPS
  | <math>b_3</math> || <math>a</math> || <math>a</math> || <math>b_3</math> || <math>b_3</math> || <math>b_3</math> || <math>a</math> || <math>a</math>
  | {{Формула|f=b_3}} || {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=b_3}} || {{Формула|f=b_3}} || {{Формула|f=b_3}} || {{Формула|f=a}} || {{Формула|f=a}}
  |- align="center"
  |- align="center"
  ! DEF
  ! DEF
  | <math>b_4</math> || <math>b_4</math> || <math>b_4</math> || <math>a</math> || <math>a</math> || <math>a</math> || <math>b_4</math> || <math>b_4</math>
  | {{Формула|f=b_4}} || {{Формула|f=b_4}} || {{Формула|f=b_4}} || {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=b_4}} || {{Формула|f=b_4}}
  |}
  |}
    
    
Строка 308: Строка 327:
  |- align="center"
  |- align="center"
  ! AB
  ! AB
  | <math>a</math> || <math>a</math> || bgcolor="lime" | <math>a</math> || bgcolor="lime" | <math>a</math> || bgcolor="#32CD32" | <math>a</math> || bgcolor="#32CD32" | <math>a</math> || bgcolor="lime" | <math>a</math> || bgcolor="lime" | <math>a</math>
  | {{Формула|f=a}} || {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}} || bgcolor="#32CD32" | {{Формула|f=a}} || bgcolor="#32CD32" | {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}}
  |- align="center"
  |- align="center"
  ! ACDPS
  ! ACDPS
  | <math>a</math> || <math>b_2</math> || <math>a</math> || <math>a</math> || bgcolor="lime" | <math>a</math> || bgcolor="lime" | <math>a</math> || <math>a</math> || <math>a</math>
  | {{Формула|f=a}} || {{Формула|f=b_2}} || {{Формула|f=a}} || {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}} || bgcolor="lime" | {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=a}}
  |- align="center"
  |- align="center"
  ! BCPS
  ! BCPS
  | <math>b_3</math> || <math>a</math> || <math>a</math> || <math>b_3</math> || <math>b_3</math> || <math>b_3</math> || <math>a</math> || <math>a</math>
  | {{Формула|f=b_3}} || {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=b_3}} || {{Формула|f=b_3}} || {{Формула|f=b_3}} || {{Формула|f=a}} || {{Формула|f=a}}
  |- align="center"
  |- align="center"
  ! DEF
  ! DEF
  | <math>b_4</math> || <math>b_4</math> || <math>b_4</math> || <math>a</math> || <math>a</math> || <math>a</math> || <math>b_4</math> || <math>b_4</math>
  | {{Формула|f=b_4}} || {{Формула|f=b_4}} || {{Формула|f=b_4}} || {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=a}} || {{Формула|f=b_4}} || {{Формула|f=b_4}}
  |}
  |}
    
    
Вот и получили строку, сплошь состоящую из <math>a</math>. Значит <math>\rho</math> обладает свойством соединения без потерь.
Вот и получили строку, сплошь состоящую из {{Формула|f=a}}. Значит {{Формула|f=\rho}} обладает свойством соединения без потерь.
 
{{Forward|l=ТОРА (9) - Лекция №4 - Хорошая схема БД - Сохранение ФЗ}}


[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]
[[Категория:Теоретические основы реляционной алгебры (9 семестр)]]
[[Категория:Конспекты лекций и семинаров]]
[[Категория:Конспекты лекций и семинаров]]

Текущая версия от 18:58, 21 января 2013

Пусть $$F$$ и $$G$$ - два множества ФЗ.

$$G$$ называется покрытием $$F$$, если имеет место равенство $$G^+ = F^+$$

Существуют различные виды покрытий. Но мы рассмотрим только один - условно-неизбыточное покрытие.

Алгоритм построения условно-неизбыточного покрытия

1) если в множестве ФЗ $$F$$ встречаются ФЗ с одинаковой левой частью $$X$$, то следует объединить эти ФЗ в одну ФЗ. Это следует из леммы объединения. Получившееся множество ФЗ обозначим $$G$$;

2) для каждой ФЗ $$X\rightarrow Y$$ из $$G$$ заменить её на $$X\rightarrow X^+ - X$$;

После выполнения 1) и 2) получаем замыкание $$G^+ = F^+$$

Доказательство

1)

Докажем, что если ФЗ $$X\rightarrow Y\in F$$ (из этого следует, что $$Y \subseteq X^+$$ (1) по определению замыкания множества аттрибутов), то эта ФЗ принадежит $$G^+$$
По построению $$G$$ имеет место ФЗ: $$X\rightarrow X^+ - X$$ (2)
Пополним эту ФЗ: $$X\rightarrow (X^+ - X)\bigcup X$$, получится, что $$X\rightarrow X^+$$ (3)
Теперь по первой аксиоме Армстронга из (1) имеем $$X^+\rightarrow Y$$ (4)
Значит, $$X\rightarrow Y \in G^+$$, по третьей аксиоме Армстронга, исходя из (3) и (4).

2)

Докажем обратное, что если $$X\rightarrow Y \in G$$, то $$X\rightarrow Y \in F^+$$
По построению $$G$$ имеем: $$Y = X^+ - X$$ (5)
Для $$F$$ имеем:
$$X\rightarrow X^+$$ (по определению) (6)
$$X^+\rightarrow X^+ - X$$ (1 аксиома Армстронга, так как $$X^+ - X\subseteq X^+$$) (7)
$$X\rightarrow X^+ - X = Y$$ (3 аксимома Армстронга из (6)и (7), и по равенству (5))
В итоге получили $$X\rightarrow Y \in F^+$$.

Теорема доказана.

Пример

УСО: $$R = (A, B, C)$$

Множество ФЗ: $$F = (A\rightarrow B, B\rightarrow A, C\rightarrow A, A\rightarrow C, B\rightarrow C)$$

1)

$$G = (A\rightarrow BC, B\rightarrow AC, C\rightarrow A)$$

2)

$$A^+ = ABC$$, $$A^+ - A = BC$$
$$B^+ = BAC$$, $$B^+ - B = AC$$
$$C^+ = CAB$$, $$C^+ - C = AB$$


Тогда $$G = (A\rightarrow BC, B\rightarrow AC, C\rightarrow AB)$$ будет являться УНП.

Свойства "хорошей" схемы БД

"Хорошая", но не оптимальная. Должна обладать следующими свойствами:

  • соединение без потерь;
  • сохранение ФЗ;
  • каждая схема отношений в этой БД находится в 3НФ. Наличие этого свойства обеспечивает отсутствие в схемах отношений следующих аномалий:
    • избыточность;
    • потенциальная противоречивсть;
    • аномалия обновления;
    • аномалия удаления.

Соединение без потерь

Чтобы схема БД обладала свойством соединения без потерь, необходимо, чтобы хотя бы одна из таблиц содержала ключ универсальной схемы отношений.

Пусть $$\rho = (R_1 ... R_n)$$ - схема БД. Она будет обладать свойством соединения без потерь, если для любого экземпляра отношения $$r$$ из $$R$$ справедливо равенство: $$r = \Pi_{R_1}(r) \bowtie \Pi_{R_2}(r) \bowtie ... \bowtie \Pi_{R_n}(r)$$, где $$\Pi_{R_i}(r)$$ - это проекция экземпляра отношения $$r$$ на множество атрибутов $$R_i$$

Пример БД, не обладающей свойством соединения без потерь

$$R = (A, B, C)$$

$$\rho = (AB, BC) = (R_1, R_2)$$

$$F = (A\rightarrow B)$$

Достаточно привести пример экземпляра $$r$$, для которого равенство не выполняется:

A B C
$$r$$ $$a_1$$ $$b_1$$ $$c_1$$
$$a_2$$ $$b_1$$ $$c_2$$
A B
$$\Pi_{R_1}(r)$$ $$a_1$$ $$b_1$$
$$a_2$$ $$b_1$$
В С
$$\Pi_{R_2}(r)$$ $$b_1$$ $$c_1$$
$$b_1$$ $$c_2$$

Полученное соединение не будет равняться $$r$$:

A B C
$$\Pi_{R_1}(r) \bowtie \Pi_{R_2}(r)$$ $$a_1$$ $$b_1$$ $$c_1$$
$$a_1$$ $$b_1$$ $$c_2$$
$$a_2$$ $$b_1$$ $$c_1$$
$$a_2$$ $$b_1$$ $$c_2$$

Этот пример показывает, что при неправильном построении БД запросы могут выдавать неправильный результат.

Пример БД, обладающей свойством соединения без потерь

$$R = (A, B, C)$$

$$\rho = (AB, AC) = (R_1, R_2)$$

$$F = (A\rightarrow B)$$

Возьмём тот же экземпляр:

A B C
$$r$$ $$a_1$$ $$b_1$$ $$c_1$$
$$a_2$$ $$b_1$$ $$c_2$$
A B
$$\Pi_{R_1}(r)$$ $$a_1$$ $$b_1$$
$$a_2$$ $$b_1$$
A С
$$\Pi_{R_2}(r)$$ $$a_1$$ $$c_1$$
$$a_2$$ $$c_2$$

Полученное соединение будет равняться $$r$$:

A B C
$$\Pi_{R_1}(r) \bowtie \Pi_{R_2}(r)$$ $$a_1$$ $$b_1$$ $$c_1$$
$$a_2$$ $$b_1$$ $$c_2$$

Но это не доказательство, а только один пример, просто чтобы показать, в чём разница.

Алгоритм проверки схемы БД на свойство соединения без потерь

$$\rho = (R_1 ... R_n)$$

$$R = (A_1 ... A_n)$$

1) построить таблицу T:

$$A_1$$ $$A_2$$ ... $$A_k$$
$$R_1$$
$$R_2$$
...
$$R_n$$

И заполнить таблицу T по правилу: если $$A_j \in R_i$$, то $$T_{ij}=a$$, иначе $$T_{ij}=b_i$$

2) изменить таблицу T - циклически просматривать ФЗ из $$F$$ в любом порядке, и для очередной ФЗ $$X\rightarrow Y \in F$$ выполнить следующие действия:

  • найти в таблице T строки, совпадающие по атрибутам $$X$$ (по левой части);
  • если хотя бы в одной такой строке значение атрибута $$A_m \in Y = a$$, то во всех найденных строках присвоить $$A_m = a$$, иначе присвоить $$A_m = b_i$$ ($$i$$ - номер одной из найденных строк), $$b_i$$ должно быть одинаково во всех указанных строках);
  • выполнить предыдущие два пункта для всех атрибутов $$A_l \in Y$$;
  • выполнить предыдущие три пункта для всех ФЗ из $$F$$, циклически их просматривая.

3) алгоритм останавливается, если при очередном просмотре ФЗ из $$F$$:

  • не произошло никаких изменений в таблице T;
  • какая-нибудь строка в T не стала состоять сплошь из символов $$a$$ (наличие такой строки и говорит о выполнении свойства соединения без потерь).
Пример

Пусть $$R = (A, B, C)$$

$$\rho = (AB, AC) = (R_1, R_2)$$

$$F = (A\rightarrow B)$$

Доказать, что $$\rho$$ обладает свойством соединения без потерь.

1)

A B C
AB $$a$$ $$a$$ $$b_1$$
AC $$a$$ $$b_2$$ $$a$$

2)

A B C
AB $$a$$ $$a$$ $$b_1$$
AC $$a$$ $$b_2$$ $$a$$
A B C
AB $$a$$ $$a$$ $$b_1$$
AC $$a$$ $$a$$ $$a$$

Получили строку, сплошь состоящую из $$a$$. Значит $$\rho$$ обладает свойством соединения без потерь.

Другой пример

Пусть $$R = (A, B, C, D, E, F, P, S)$$

$$\rho = (AB, ACDPS, BCPS, DEF) = (R_1, R_2, R_3, R_4)$$

$$F = (B\rightarrow C, D\rightarrow EF, B\rightarrow PS, A\rightarrow CDPS, AP\rightarrow S)$$

Доказать, что $$\rho$$ обладает свойством соединения без потерь.

1)

A B C D E F P S
AB $$a$$ $$a$$ $$b_1$$ $$b_1$$ $$b_1$$ $$b_1$$ $$b_1$$ $$b_1$$
ACDPS $$a$$ $$b_2$$ $$a$$ $$a$$ $$b_2$$ $$b_2$$ $$a$$ $$a$$
BCPS $$b_3$$ $$a$$ $$a$$ $$b_3$$ $$b_3$$ $$b_3$$ $$a$$ $$a$$
DEF $$b_4$$ $$b_4$$ $$b_4$$ $$a$$ $$a$$ $$a$$ $$b_4$$ $$b_4$$

2)

первый просмотр:

A B C D E F P S
AB $$a$$ $$a$$ $$a$$ $$a$$ $$b_1$$ $$b_1$$ $$a$$ $$a$$
ACDPS $$a$$ $$b_2$$ $$a$$ $$a$$ $$a$$ $$a$$ $$a$$ $$a$$
BCPS $$b_3$$ $$a$$ $$a$$ $$b_3$$ $$b_3$$ $$b_3$$ $$a$$ $$a$$
DEF $$b_4$$ $$b_4$$ $$b_4$$ $$a$$ $$a$$ $$a$$ $$b_4$$ $$b_4$$

второй просмотр:

A B C D E F P S
AB $$a$$ $$a$$ $$a$$ $$a$$ $$a$$ $$a$$ $$a$$ $$a$$
ACDPS $$a$$ $$b_2$$ $$a$$ $$a$$ $$a$$ $$a$$ $$a$$ $$a$$
BCPS $$b_3$$ $$a$$ $$a$$ $$b_3$$ $$b_3$$ $$b_3$$ $$a$$ $$a$$
DEF $$b_4$$ $$b_4$$ $$b_4$$ $$a$$ $$a$$ $$a$$ $$b_4$$ $$b_4$$

Вот и получили строку, сплошь состоящую из $$a$$. Значит $$\rho$$ обладает свойством соединения без потерь.

продолжение...