Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Klucze obce odwołujące się do wielu tabel

Warto rozważyć model danych typu/podtypu. Jest to bardzo podobne do klasy/podklas w programowaniu obiektowym, ale jest o wiele bardziej niewygodne w implementacji i żaden RDBMS (o którym jestem świadomy) natywnie ich nie obsługuje. Ogólna idea to:

  • Określasz typ (budynek), tworzysz dla niego tabelę, nadajesz klucz podstawowy
  • Definiujesz dwa lub więcej podtypów (tutaj, Szpital, Klinika, Szkoła, Uniwersytet), tworzysz tabele dla każdego z nich, tworzysz klucze podstawowe… ale klucze podstawowe są również kluczami obcymi, które odwołują się do tabeli Building
  • Twoja tabela z jedną kolumną „ObjectType” może być teraz zbudowana za pomocą klucza obcego w tabeli Building. Musiałbyś dołączyć do kilku stołów, aby ustalić, jaki to jest budynek, ale i tak musiałbyś to zrobić. To lub przechowuj nadmiarowe dane.

Zauważyłeś problem z tym modelem, prawda? Co sprawi, że budynek nie będzie zawierał wpisów w dwóch lub więcej tabelach podtypów? Cieszę się, że zapytałeś:

  1. Dodaj kolumnę, być może „BuildingType”, do budynku, powiedzmy char(1) z dozwolonymi wartościami {H, C, S, U} wskazującymi (duh) typ budynku.
  2. Utwórz unikalne ograniczenie dla BuildingID + BuildingType
  3. Umieść kolumnę BulidingType w podtabelach. Umieść na nim ograniczenie sprawdzające, aby zawsze mogło być ustawione na wartość (H dla tabeli Szpitale itp.). Teoretycznie może to być kolumna obliczona; w praktyce to nie zadziała z powodu następującego kroku:
  4. Zbuduj klucz obcy, aby powiązać tabele za pomocą obu kolumn

Voila:Biorąc pod uwagę zestaw wierszy BUILDING z typem H, wpis w tabeli SCHOOL (z typem S) nie może odnosić się do tego budynku

Przypominasz sobie, że powiedziałem, że było to trudne do wdrożenia.

W rzeczywistości najważniejsze pytanie brzmi:czy warto to robić? Jeśli ma sens zaimplementowanie czterech (lub więcej, w miarę upływu czasu) typów budynków jako typu/podtypu (dalsze korzyści z normalizacji:jedno miejsce na adres i inne atrybuty wspólne dla każdego budynku, z atrybutami charakterystycznymi dla budynku przechowywanymi w podtabelach), może być warta dodatkowego wysiłku, aby zbudować i utrzymać. Jeśli nie, to wracasz do punktu wyjścia:logicznego modelu, który jest trudny do wdrożenia w przeciętnym współczesnym RDBMS.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego używanie kursorów w SQL Server jest uważane za złą praktykę?

  2. Eksportuj dane serwera SQL do pliku CSV

  3. jak skonfigurować plik konfiguracyjny hibernacji dla serwera sql?

  4. SQL Server SELECT do istniejącej tabeli

  5. 2 sposoby sprawdzenia, czy dostęp do danych jest włączony w SQL Server (przykłady T-SQL)