PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy są jakieś opcje łączenia tabeli dla skojarzeń wiele-do-wielu?

  • 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).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql generuje_serie miesięcy

  2. Jak wdrożyć dystrybucję Percona dla PostgreSQL w celu zapewnienia wysokiej dostępności?

  3. Kolumna nie istnieje?

  4. Jak zmienić bazę danych na postgresql za pomocą Symfony 2.0?

  5. Czy można podać parametry dla nazwy tabeli lub kolumny w przygotowanych instrukcjach lub w QueryRunner.update()?