-
Jeśli modele nie mają wspólnych grup kolorów, projekt będzie składał się z jednej tabeli:
model [model] comes in color [color]
-
Jeśli modele mają wspólne grupy kolorów, mają dwie tabele:
model [model] comes in the colors of group [group] group [group] has color [color]
Te tabele łączą się z rzutem na pierwszą tabelę:
SELECT model, color FROM model_group NATURAL JOIN group_color
-
Jeśli model może mieć wyjątkowe dostępne i/lub niedostępne kolory jako dodatek do grupy lub zamiast niej, zastosuj tabele wyjątków. Grupa tabeli jest teraz domyślną kolory (jeśli występują):
model [model] has default color group [group] group [group] has color [color] model [model] is exceptionally available in color [color] model [model] is exceptionally unavailable in color [color]
Tabele wyjątków są następnie odpowiednio UNIONed i MINUSed/EXCEPTed z JOIN-plus-PROJECT/SELECT, aby nadać pierwszej tabeli:
SELECT group, color FROM model_default NATURAL JOIN group_colour EXCEPT SELECT * FROM model_unavailable UNION SELECT * FROM model_available
„Nadmiarowość” nie dotyczy wartości pojawiających się w wielu miejscach. Chodzi o wiele wierszy zawierających to samo o aplikacji.
Każda tabela (i wyrażenie zapytania) ma skojarzony szablon instrukcji wypełniania (nazwanych) pustych miejsc (czyli predykat). Wiersze, które tworzą prawdziwe stwierdzenie, trafiają do tabeli. Jeśli masz dwa niezależne predykaty, potrzebujesz dwóch tabel. Odpowiednie wartości znajdują się w rzędach każdego z nich.
Ponowne wiersze zawierające oświadczenia dotyczące aplikacji zobacz to. (I przeszukaj moje inne odpowiedzi odnoszą się do „oświadczenia” lub „kryterium” tabeli). Normalizacja pomaga, ponieważ zastępuje tabele, których wiersze zawierają elementy postaci „... AND ...” innymi tabelami, które zawierają „... " osobno. Zobacz to i to.
Jeśli udostępniasz grupy i używasz tylko jednej dwukolumnowej tabeli dla modelu i koloru, jego predykat to:
FOR SOME group
model [model] comes in the colors of group [group]
AND group [group] has color [color]
Tak więc drugi punkt usuwa pojedyncze „AND” z tego predykatu, tj. źródło „wielowartościowej zależności”. W przeciwnym razie, jeśli zmienisz grupę modelu lub kolory grupy, musisz jednocześnie konsekwentnie zmieniać wiele wierszy. (Chodzi o ograniczenie błędów i złożoności wynikających z nadmiarowości, a nie oszczędność miejsca).
Jeśli nie chcesz powtarzać ciągów ze względów implementacyjnych (zależnych od implementacji) (zajęte miejsce lub szybkość operacji kosztem większej liczby złączeń) dodaj tabelę identyfikatorów nazw i ciągów znaków i zastąp kolumny i wartości starych nazw kolumnami i wartościami identyfikatora. (To nie jest normalizacja, to komplikuje twój schemat ze względu na kompromisy w optymalizacji danych zależne od implementacji. I powinieneś zademonstrować jest to potrzebne i działa).