sql >> Databáze >  >> RDS >> Sqlserver

Složený primární klíč vs další sloupec ID?

Řekněme, že {Author, Title, Edition} jednoznačně identifikuje knihu, pak platí následující:

  1. Je to superklíč -- jednoznačně identifikuje n-tici (řádek).

  2. Je neredukovatelný – odstranění kteréhokoli sloupce z něj již neudělá klíč.

  3. Je to kandidátský klíč -- neredukovatelný superklíč je kandidátský klíč.

Nyní uvažujme ID (celé číslo)

Dokážu odůvodnit, že Book klíč tabulky se zobrazí v několika dalších tabulkách jako cizí klíč a také v několika indexech. Takže to zabere docela dost místa – řekněme tři sloupce x 40 znaků (nebo cokoli jiného...) – v každé z těchto tabulek plus v odpovídajících indexech.

Aby byly tyto „ostatní“ tabulky a indexy menší, mohu do Book přidat jedinečný celočíselný sloupec tabulka, která má být použita jako klíč, na který se bude odkazovat jako na cizí klíč. Řekněte něco jako:

alter table Book add BookID integer not null identity;

S BookID Book je také (musí být) jedinečná tabulka má nyní dva kandidátní klíče.

Nyní mohu vybrat BookID jako primární klíč.

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

Nicméně {Author,Title,Edition} musí zůstat klíčem (jedinečným), aby se zabránilo něco takového:

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

Abych to shrnul, přidáním BookID -- a jeho výběr jako primární -- nezastavil {Author, Title, Edition} být klíčem (kandidáta). Stále musí mít své vlastní jedinečné omezení a obvykle odpovídající index.

Všimněte si také, že od návrhu bylo toto rozhodnutí učiněno na „fyzické úrovni“. Obecně, na logické úrovni návrhu, toto ID neexistuje -- byl zaveden při zvažování velikostí sloupců a indexů. Takže fyzické schéma bylo odvozeno od logického. V závislosti na velikosti databáze, RDBMS a použitém hardwaru nemusí mít žádné z těchto úvah o velikosti měřitelný účinek – takže pomocí {Author, Title, Edition} jako PK může být dokonale dobrý design - dokud se neprokáže jinak.



  1. Vynulujte počítadlo automatického přírůstku v postgresu

  2. Nelze se připojit k místnímu serveru MySQL přes soket '/var/mysql/mysql.sock' (38)

  3. Víceřadá vložka s pg-promise

  4. Pomocí sys.trigger_event_types vypište typy událostí spouštění na serveru SQL Server