Boyceho–Coddova normální forma
Boyceho–Coddova normální forma (BCNF) je jednou z normálních forem používaných při normalizaci databáze.
BCNF byla vytvořena v roce 1974 Raymondem Boycem a Edgarem Coddem, aby odstranila některé anomálie, které se vyskytují v relacích, které jsou ve 3NF. Chris Date upozornil,[1] že definice BCNF se prvně objevila v článku od Ian-a Heath-a už v roce 1971.[2]
Definice BCNF: Relace R je v BCNF tehdy a jen tehdy, když pro každou netriviální závislost X → Y, kde X a Y jsou množiny atributů a zároveň Y není podmnožinou X, platí, že X je nadmnožinou nějakého klíče, nebo X je klíčem relace R. Jinak řečeno relace R je v BCNF tehdy a jen tehdy, když každý determinant funkční závislosti v relaci R je zároveň kandidátním klíčem relace R.
Relace v 3NF, která není v BCNF
[editovat | editovat zdroj]Každá relace, která je v BCNF je zároveň ve 3. normální formě; naopak relace, která je ve 3. normální formě nemusí být v BCNF, a to pokud platí tyto skutečnosti:
- v relaci existuje více kandidátních klíčů,
- existuje takový atribut, který je společný pro všechny kandidátní klíče.
Příklad
[editovat | editovat zdroj]Následující tabulka eviduje rezervace dvou tenisových kurtů. Současně máme (konvencí) definovaná tato ohodnocení (Rate Type):
- SAVER, pro kurt 1, sjednané členy klubu
- STANDARD, pro kurt 1, sjednané nečleny klubu
- PREMIUM-A, pro kurt 2, sjednané členy klubu
- PREMIUM-B, pro kurt 2, sjednané nečleny klubu
Court | Start Time | End Time | Rate Type |
---|---|---|---|
1 | 09:30 | 10:30 | SAVER |
1 | 11:00 | 12:00 | SAVER |
1 | 14:00 | 15:30 | STANDARD |
2 | 10:00 | 11:30 | PREMIUM-B |
2 | 11:30 | 13:30 | PREMIUM-B |
2 | 15:00 | 16:30 | PREMIUM-A |
Tato tabulka je v 3NF, ale není v BCNF. Příklad řešení, které BCNF splňuje, vytvořilo novou tabulku, která sjednocuje číslo kurtu a hodnocení.
Rate Type | Court | Member Flag |
---|---|---|
SAVER | 1 | Yes |
STANDARD | 1 | No |
PREMIUM-A | 2 | Yes |
PREMIUM-B | 2 | No |
Rate Type | Start Time | End Time |
---|---|---|
SAVER | 09:30 | 10:30 |
SAVER | 11:00 | 12:00 |
STANDARD | 14:00 | 15:30 |
PREMIUM-B | 10:00 | 11:30 |
PREMIUM-B | 11:30 | 13:30 |
PREMIUM-A | 15:00 | 16:30 |