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

Złożony klucz podstawowy a kolumna dodatkowego identyfikatora?

Powiedz, że {Author, Title, Edition} jednoznacznie identyfikuje książkę, wówczas obowiązuje następujący zapis:

  1. Jest to superklucz — jednoznacznie identyfikuje krotkę (wiersz).

  2. Jest nieredukowalny — usunięcie którejkolwiek z kolumn nie czyni z niej już klucza.

  3. Jest to klucz kandydujący — nieredukowalny superklucz jest kluczem kandydującym.

Rozważmy teraz identyfikator (liczba całkowita)

Mogę stwierdzić, że Book klucz tabeli pojawi się w kilku innych tabelach jako klucz obcy, a także w kilku indeksach. Tak więc zajmie to sporo miejsca – powiedzmy trzy kolumny x 40 znaków (lub cokolwiek…) – w każdej z tych tabel plus pasujące indeksy.

Aby zmniejszyć te „inne” tabele i indeksy, mogę dodać unikatową kolumnę całkowitą do Book tabela, która ma być używana jako klucz, do którego odwołuje się klucz obcy. Powiedz coś takiego:

alter table Book add BookID integer not null identity;

Z BookID będąc (musi być) również unikalnym, Book tabela ma teraz dwa klucze kandydujące.

Teraz mogę wybrać BookID jako klucz podstawowy.

alter table Book add constraint pk_Book primary key (BookID);

Jednak {Author,Title,Edition} musi pozostań kluczem (unikalny), aby zapobiegać coś takiego:

BookID  Author      Title           Edition
-----------------------------------------------
  1      C.J.Date  Database Design     1
  2      C.J.Date  Database Design     1

Podsumowując, dodając BookID -- i wybranie go jako podstawowego -- nie powstrzymało {Author, Title, Edition} bycie kluczem (kandydata). Wciąż musi mieć swoje własne unikalne ograniczenie i zwykle pasujący indeks.

Należy również zauważyć, że z punktu projektowego decyzja ta została podjęta na „poziomie fizycznym”. Ogólnie rzecz biorąc, na logicznym poziomie projektu ten ID nie istnieje — został wprowadzony podczas rozpatrywania rozmiarów kolumn i indeksów. Tak więc schemat fizyczny został wyprowadzony z logicznego. W zależności od rozmiaru bazy danych, RDBMS i używanego sprzętu, żadne z tych uzasadniających rozmiar nie może mieć wymiernego efektu - więc użyj {Author, Title, Edition} jako PK może być doskonale dobrym projektem - dopóki nie zostanie udowodnione inaczej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server JEŚLI NIE ISTNIEJE Użycie?

  2. Jak generować instrukcje wstawiania z danych programu Excel i ładować do tabeli programu SQL Server — samouczek SQL Server / TSQL, część 103

  3. Jak generować skrypty, aby dodać domyślne ograniczenia do kolumny w wielu tabelach w bazie danych programu SQL Server — samouczek SQL Server / TSQL, część 94

  4. Jak uzyskać listę kolumn z unikalnymi ograniczeniami w bazie danych SQL Server — samouczek SQL Server / TSQL część 98?

  5. Użyj FILEGROUP_ID(), aby zwrócić identyfikator grupy plików w SQL Server