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

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество
Перейти к навигации Перейти к поиску
Нет описания правки
мНет описания правки
Строка 1: Строка 1:
Пусть <math>F</math> и <math>G</math> - два множества ФЗ.
Пусть $F$ и $G$ - два множества ФЗ.


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


Существуют различные виды покрытий. Но мы рассмотрим только один - ''условно-неизбыточное покрытие''.
Существуют различные виды покрытий. Но мы рассмотрим только один - ''условно-неизбыточное покрытие''.
Строка 7: Строка 7:
== Алгоритм построение условно-неизбыточного покрытия ==
== Алгоритм построение условно-неизбыточного покрытия ==


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


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


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


=== Доказательство ===
=== Доказательство ===
Строка 17: Строка 17:
1)
1)


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


:По построению G имеет место ФЗ: <math>X\rightarrow X^+ - X</math>
:По построению G имеет место ФЗ: $X\rightarrow X^+ - X$


:Пополним эту ФЗ: <math>X\rightarrow (X^+ - X)\bigcup X = X^+</math>
:Пополним эту ФЗ: $X\rightarrow (X^+ - X)\bigcup X = X^+$


:Теперь по первой аксиоме Армстронга имеем <math>X^+\rightarrow Y</math>
:Теперь по первой аксиоме Армстронга имеем $X^+\rightarrow Y$


:Значит, <math>X\rightarrow Y \in G^+</math>, по третьей аксиоме Армстронга.
:Значит, $X\rightarrow Y \in G^+$, по третьей аксиоме Армстронга.


2)
2)


:<math>X\rightarrow Y \in G</math>, <math>X\rightarrow Y \in F^+</math>
:$X\rightarrow Y \in G$, $X\rightarrow Y \in F^+$


:<math>Y = X^+ - X</math>
:$Y = X^+ - X$


:<math>X\rightarrow X^+</math> (по определению)
:$X\rightarrow X^+$ (по определению)


:<math>X^+\rightarrow X^+ - X</math> (1 аксиома Армстронга)
:$X^+\rightarrow X^+ - X$ (1 аксиома Армстронга)


:<math>X^+\rightarrow X^+ - X = Y</math> (3 аксимома Армстронга)
:$X^+\rightarrow X^+ - X = Y$ (3 аксимома Армстронга)


:<math>X^+\rightarrow Y \in F^+</math>
:$X^+\rightarrow Y \in F^+$


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


УСО: <math>R = (A, B, C)</math>
УСО: $R = (A, B, C)$


Множество ФЗ: <math>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)$


1) <math>G = (A\rightarrow BC, B\rightarrow AC, C\rightarrow A</math>
1) $G = (A\rightarrow BC, B\rightarrow AC, C\rightarrow A$


2)
2)


<math>A^+ = ABC</math>, <math>A^+ - A = BC</math>
$A^+ = ABC$, $A^+ - A = BC$


<math>B^+ = BAC</math>, <math>B^+ - B = AC</math>
$B^+ = BAC$, $B^+ - B = AC$


<math>C^+ = CAB</math>, <math>C^+ - C = AB</math>
$C^+ = CAB$, $C^+ - C = AB$




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


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


Пусть <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>
Пусть $\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$


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


<math>R = (A, B, C)</math>
$R = (A, B, C)$


<math>\rho = (AB, BC) = (R_1, R_2)</math>
$\rho = (AB, BC) = (R_1, R_2)$


<math>F = (A\rightarrow B)</math>
$F = (A\rightarrow B)$


Достаточно привести пример экземпляра <math>r</math>, для которого равенство не выполняется:
Достаточно привести пример экземпляра $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" | $r$ || $a_1$ || $b_1$ || $c_1$
  |- align="center"
  |- align="center"
  | <math>a_2</math> || <math>b_1</math> || <math>c_2</math>
  | $a_2$ || $b_1$ || $c_2$
  |}
  |}
   
   
Строка 98: Строка 98:
  ! !! 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" | $\Pi_{R_1}(r)$ || $a_1$ || $b_1$
  |- align="center"
  |- align="center"
  | <math>a_2</math> || <math>b_1</math>
  | $a_2$ || $b_1$
  |}
  |}
  |
  |
Строка 108: Строка 108:
  ! !! A !! B
  ! !! A !! B
  |- align="center"
  |- align="center"
  | rowspan="2" | <math>\Pi_{R_2}(r)</math> || <math>b_1</math> || <math>c_1</math>
  | rowspan="2" | $\Pi_{R_2}(r)$ || $b_1$ || $c_1$
  |- align="center"
  |- align="center"
  | <math>b_1</math> || <math>c_2</math>
  | $b_1$ || $c_2$
  |}
  |}
|}
|}


Полученное соединение не будет равняться <math>r</math>:
Полученное соединение не будет равняться $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" | $\Pi_{R_1}(r) \bowtie \Pi_{R_2}(r)$ || $a_1$ || $b_1$ || $c_1$
  |- align="center" bgcolor="#FFB6C1"
  |- align="center" bgcolor="#FFB6C1"
  | <math>a_1</math> || <math>b_1</math> || <math>c_2</math>
  | $a_1$ || $b_1$ || $c_2$
  |- align="center" bgcolor="#FFB6C1"
  |- align="center" bgcolor="#FFB6C1"
  | <math>a_2</math> || <math>b_1</math> || <math>c_1</math>
  | $a_2$ || $b_1$ || $c_1$
  |- align="center"
  |- align="center"
  | <math>a_2</math> || <math>b_1</math> || <math>c_2</math>
  | $a_2$ || $b_1$ || $c_2$
  |}
  |}
   
   
Строка 132: Строка 132:
==== Пример БД, обладающей свойством соединения без потерь ====
==== Пример БД, обладающей свойством соединения без потерь ====


<math>R = (A, B, C)</math>
$R = (A, B, C)$


<math>\rho = (AB, AC) = (R_1, R_2)</math>
$\rho = (AB, AC) = (R_1, R_2)$


<math>F = (A\rightarrow B)</math>
$F = (A\rightarrow B)$


Возьмём тот же экземпляр:
Возьмём тот же экземпляр:
Строка 143: Строка 143:
  ! !! 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" | $r$ || $a_1$ || $b_1$ || $c_1$
  |- align="center"
  |- align="center"
  | <math>a_2</math> || <math>b_1</math> || <math>c_2</math>
  | $a_2$ || $b_1$ || $c_2$
  |}
  |}


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


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


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


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


Пусть <math>R = (A, B, C)</math>
Пусть $R = (A, B, C)$


<math>\rho = (AB, AC) = (R_1, R_2)</math>
$\rho = (AB, AC) = (R_1, R_2)$


<math>F = (A\rightarrow B)</math>
$F = (A\rightarrow B)$


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


1)
1)
Строка 233: Строка 233:
  |- align="center"
  |- align="center"
  ! AB
  ! AB
  | <math>a</math> || <math>a</math> || <math>b_1</math>
  | $a$ || $a$ || $b_1$
  |- align="center"
  |- align="center"
  ! BC
  ! BC
  | <math>a</math> || <math>b_2</math> || <math>a</math>
  | $a$ || $b_2$ || $a$
  |}
  |}


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


Доказать, что <math>\rho</math> обладает свойством соединения без потерь.
Доказать, что $\rho$ обладает свойством соединения без потерь.
   
   
1)
1)
Строка 284: Строка 284:
  |- 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>
  | $a$ || $a$ || $b_1$ || $b_1$ || $b_1$ || $b_1$ || $b_1$ || $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>
  | $a$ || $b_2$ || $a$ || $a$ || $b_2$ || $b_2$ || $a$ || $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>
  | $b_3$ || $a$ || $a$ || $b_3$ || $b_3$ || $b_3$ || $a$ || $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>
  | $b_4$ || $b_4$ || $b_4$ || $a$ || $a$ || $a$ || $b_4$ || $b_4$
  |}
  |}
   
   
Строка 304: Строка 304:
  |- 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>
  | $a$ || $a$ || bgcolor="lime" | $a$ || bgcolor="lime" | $a$ || $b_1$ || $b_1$ || bgcolor="lime" | $a$ || bgcolor="lime" | $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>
  | $a$ || $b_2$ || $a$ || $a$ || bgcolor="lime" | $a$ || bgcolor="lime" | $a$ || $a$ || $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>
  | $b_3$ || $a$ || $a$ || $b_3$ || $b_3$ || $b_3$ || $a$ || $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>
  | $b_4$ || $b_4$ || $b_4$ || $a$ || $a$ || $a$ || $b_4$ || $b_4$
  |}
  |}
    
    
Строка 322: Строка 322:
  |- 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>
  | $a$ || $a$ || bgcolor="lime" | $a$ || bgcolor="lime" | $a$ || bgcolor="#32CD32" | $a$ || bgcolor="#32CD32" | $a$ || bgcolor="lime" | $a$ || bgcolor="lime" | $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>
  | $a$ || $b_2$ || $a$ || $a$ || bgcolor="lime" | $a$ || bgcolor="lime" | $a$ || $a$ || $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>
  | $b_3$ || $a$ || $a$ || $b_3$ || $b_3$ || $b_3$ || $a$ || $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>
  | $b_4$ || $b_4$ || $b_4$ || $a$ || $a$ || $a$ || $b_4$ || $b_4$
  |}
  |}
    
    
Вот и получили строку, сплошь состоящую из <math>a</math>. Значит <math>\rho</math> обладает свойством соединения без потерь.
Вот и получили строку, сплошь состоящую из $a$. Значит $\rho$ обладает свойством соединения без потерь.


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

Версия от 01:58, 20 сентября 2012

Пусть $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$, то эта ФЗ принадежит $G^+$, а из этого следует, что $Y \subseteq X^+$
По построению G имеет место ФЗ: $X\rightarrow X^+ - X$
Пополним эту ФЗ: $X\rightarrow (X^+ - X)\bigcup X = X^+$
Теперь по первой аксиоме Армстронга имеем $X^+\rightarrow Y$
Значит, $X\rightarrow Y \in G^+$, по третьей аксиоме Армстронга.

2)

$X\rightarrow Y \in G$, $X\rightarrow Y \in F^+$
$Y = X^+ - X$
$X\rightarrow X^+$ (по определению)
$X^+\rightarrow X^+ - X$ (1 аксиома Армстронга)
$X^+\rightarrow X^+ - X = Y$ (3 аксимома Армстронга)
$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$
A B
$\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 B
$\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$
BC $a$ $b_2$ $a$

2)

A B C
AB $a$ $a$ $b_1$
BC $a$ $b_2$ $a$
A B C
AB $a$ $a$ $b_1$
BC $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$ обладает свойством соединения без потерь.