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

Projektowanie relacji 1:1 i 1:m w SQL Server

Każda relacja wymaga, aby tabela „nadrzędna” (po jednej stronie) miała klucz podstawowy (lub unikalny) (PK), który jednoznacznie identyfikuje każdy wiersz, a tabela „podrzędna” (po drugiej stronie) miała kolumnę lub kolumny klucza obcego , które muszą być wypełnione wartościami, które są takie same jak niektóre istniejące wartości klucza podstawowego w tabeli nadrzędnej. Jeśli chcesz relacji jeden do wielu (1-M), klucz obcy powinien być zwykłym atrybutem (kolumną lub kolumnami) w tabeli podrzędnej, który może się powtarzać (może być wiele wierszy o tej samej wartości)

Jeśli chcesz relacji jeden do jednego (1-1), klucz obcy sam powinien być kluczem podstawowym lub unikalnym indeksem w tabeli podrzędnej, który gwarantuje, że w tabeli podrzędnej może znajdować się co najwyżej jeden wiersz z tą wartością.

Relacja 1-1 skutecznie dzieli atrybuty (kolumny) w tabeli na dwie tabele. Nazywa się to segmentacją pionową. Często robi się to dla podklas encje tabeli lub, z innego powodu, jeśli wzorce użycia w kolumnach w tabeli wskazują, że dostęp do kilku kolumn musi być znacznie częstszy niż do pozostałych kolumn. (Powiedzmy, że jedna lub dwie kolumny będą dostępne tysiące razy na sekundę, a pozostałe 40 kolumn będzie dostępne tylko raz w miesiącu). Partycjonowanie tabeli w ten sposób zoptymalizuje wzorzec przechowywania dla tych dwóch różnych zapytań.

Podklasa . Powyższe w rzeczywistości tworzy relację od 1 do zera lub jeden, która jest używana do tak zwanej relacji podklasy lub podtypu. Dzieje się tak, gdy masz dwie różne jednostki, które mają dużą liczbę atrybutów, ale jedna z nich ma dodatkowe atrybuty, których druga nie potrzebuje. Dobrym przykładem mogą być Pracownicy , oraz pracownicy najemcy . Pracownik tabela miałaby wszystkie atrybuty wspólne dla wszystkich pracowników, a SalariedEmployee tabela będzie istniała w relacji (1-0/1) z pracownikami, z dodatkowymi atrybutami (Wynagrodzenie , Wakacje itp.), których potrzebują tylko pracownicy otrzymujący wynagrodzenie.

Jeśli naprawdę chcesz relacji 1-1, musisz dodać inny mechanizm, aby zagwarantować, że tabela podrzędna zawsze będzie miała jeden rekord dla każdego rekordu/wiersza w tabeli nadrzędnej. Ogólnie rzecz biorąc, jedynym sposobem, aby to zrobić, jest wymuszenie tego w kodzie używanym do wstawiania danych (w wyzwalaczu, procedurze składowanej lub kodzie poza bazą danych). Dzieje się tak, ponieważ jeśli dodano ograniczenia integralności referencyjnej do dwóch tabel, które wymagają, aby wiersze zawsze znajdowały się w obu, nie byłoby możliwe dodanie wiersza do żadnej z nich bez naruszenia jednego z ograniczeń i nie można dodać wiersza do obu stoły w tym samym czasie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyświetlić zapytanie i wyniki w oddzielnej karcie w SQL Server Management Studio (SSMS) — samouczek SQL Server / TSQL, część 15

  2. ExecuteNonQuery zwraca -1 podczas używania sql COUNT pomimo ciągu zapytania

  3. Potrzebuję zapytania sql, aby pogrupować według nazwy, ale zwrócić inne pola na podstawie najnowszego wpisu

  4. Gdzie są rejestrowane próby połączenia z programem SQL Server?

  5. Czy wartości indeksu programu SQL Server Null w nieklastrowym indeksie nieunikatowym?