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

Navrhování vztahů 1:1 a 1:m v SQL Server

Jakýkoli vztah vyžaduje, aby „nadřazená“ tabulka (jedna strana) měla primární (nebo jedinečný) klíč (PK), který jednoznačně identifikuje každý řádek, a „podřízená“ tabulka (druhá strana) měla sloupec nebo sloupce cizího klíče. , který musí být naplněn hodnotami, které jsou stejné jako některé existující hodnoty primárního klíče v nadřazené tabulce. Pokud chcete vztah jedna k mnoha (1-M), pak by cizí klíč měl být obyčejný atribut (sloupec nebo sloupce) v podřízené tabulce, který se může opakovat (může být mnoho řádků se stejnou hodnotou)

Pokud chcete vztah jedna ku jedné (1-1), pak by cizí klíč měl být sám primárním klíčem nebo jedinečným indexem v podřízené tabulce, který zaručuje, že v podřízené tabulce může být nejvýše jeden řádek s touto hodnotou.

Vztah 1-1 efektivně rozděluje atributy (sloupce) v tabulce do dvou tabulek. Toto se nazývá vertikální segmentace. To se často provádí pro podtřídy entity tabulky nebo z jiného důvodu, pokud vzorce použití ve sloupcích v tabulce naznačují, že k několika sloupcům je třeba přistupovat výrazně častěji než ke zbývajícím sloupcům. (Řekněme, že jeden nebo dva sloupce budou přístupné 1000krát za sekundu a dalších 40 sloupců bude přístupných pouze jednou za měsíc). Rozdělení tabulky tímto způsobem ve skutečnosti optimalizuje vzor úložiště pro tyto dva různé dotazy.

Podtřída . Výše uvedené ve skutečnosti vytváří vztah 1 až nula nebo jeden vztah, který se používá pro to, co se nazývá vztah podtřídy nebo podtypu. K tomu dochází, když máte dvě různé entity, které sdílejí velký počet atributů, ale jedna z entit má další atributy, které druhá nepotřebuje. Dobrým příkladem mohou být Zaměstnanci a Platí zaměstnanci . Zaměstnanec tabulka by měla všechny atributy, které sdílejí všichni zaměstnanci, a SalariedEmployee tabulka by existovala ve vztahu (1-0/1) se zaměstnanci s dalšími atributy (Plat , Roční dovolená atd.), které potřebují pouze zaměstnanci se mzdou.

Pokud opravdu chcete vztah 1-1, musíte přidat další mechanismus, který zaručí, že podřízená tabulka bude mít vždy jeden záznam pro každý záznam/řádek v nadřazené tabulce. Obecně jediný způsob, jak toho dosáhnout, je vynutit to v kódu používaném k vkládání dat (buď ve spouštěči, uložené proceduře nebo kódu mimo databázi). Důvodem je, že pokud přidáte omezení referenční integrity do dvou tabulek, které vyžadují, aby řádky byly vždy v obou, nebylo by možné přidat řádek do žádné z nich, aniž by došlo k porušení jednoho z omezení, a nemůžete přidat řádek do obou. stoly ve stejnou dobu.



  1. Jak napsat kód v Oracle SQL (jako 'CCYYMMDD' do 102)

  2. Jak mohu změnit pořadí sloupců v editoru dotazů MySQL?

  3. Použití MySql mezi klauzulí s daty

  4. Mysql + počítat všechna slova ve sloupci