sql >> Database >  >> RDS >> Sqlserver

1:1 en 1:m relaties ontwerpen in SQL Server

Elke relatie vereist dat de "bovenliggende" tabel (de ene kant) een primaire (of unieke) sleutel (PK) heeft, die elke rij uniek identificeert, en de "onderliggende" tabel (de andere kant) een kolom of kolommen met een externe sleutel heeft , die moet worden gevuld met waarden die hetzelfde zijn als sommige bestaande waarde [s] van de primaire sleutel in de bovenliggende tabel. Als u een één-op-veel-relatie (1-M) wilt, moet de externe sleutel een gewoon attribuut zijn (kolom of kolommen) in de onderliggende tabel die kan worden herhaald (er kunnen veel rijen zijn met dezelfde waarde)

Als u een één-op-één (1-1) relatie wilt, moet de externe sleutel zelf een primaire sleutel of een unieke index in de onderliggende tabel zijn die garandeert dat er maximaal één rij in de onderliggende tabel met die waarde mag zijn.

Een 1-1-relatie verdeelt de attributen (kolommen) in een tabel effectief in twee tabellen. Dit wordt verticale segmentatie genoemd. Dit wordt vaak gedaan voor subklassen de tabelentiteiten, of, om een ​​andere reden, als de gebruikspatronen op de kolommen in de tabel aangeven dat enkele kolommen aanzienlijk vaker moeten worden geopend dan de rest van de kolommen. (Stel dat een of twee kolommen duizenden keren per seconde worden geopend en de andere 40 kolommen slechts één keer per maand). Door de tabel op deze manier te partitioneren, wordt het opslagpatroon voor die twee verschillende query's in feite geoptimaliseerd.

Subclassificatie . Het bovenstaande creëert in feite een relatie van 1 tot nul of één, die wordt gebruikt voor wat een subklasse- of subtyperelatie wordt genoemd. Dit gebeurt wanneer u twee verschillende entiteiten hebt die een groot aantal kenmerken delen, maar een van de entiteiten heeft extra kenmerken die de andere niet nodig heeft. Een goed voorbeeld zijn Werknemers , en Bezoldigde Werknemers . De Medewerker tabel zou alle attributen bevatten die alle werknemers delen, en de SalariedEmployee tabel zou bestaan ​​in een (1-0/1) relatie met Werknemers, met de aanvullende kenmerken (Salaris , Jaarlijkse Vakantie , enz.) die alleen werknemers in loondienst nodig hebben.

Als je echt een 1-1-relatie wilt, dan moet je een ander mechanisme toevoegen om te garanderen dat de onderliggende tabel altijd één record heeft voor elke record/rij in de bovenliggende tabel. Over het algemeen is de enige manier om dit te doen door dit af te dwingen in de code die wordt gebruikt om gegevens in te voegen (in een trigger, opgeslagen procedure of code buiten de database). Dit komt omdat als u referentiële integriteitsbeperkingen aan twee tabellen zou toevoegen die vereisen dat rijen altijd in beide staan, het niet mogelijk zou zijn om een ​​rij toe te voegen aan een van beide zonder een van de beperkingen te schenden, en u kunt geen rij aan beide toevoegen tafels tegelijk.



  1. hoe kan ik de beperking van de externe sleutel controleren op verwijderingsbeperking met behulp van PHP?

  2. Tabelfunctie gebruiken in OBIEE RPD (fysieke laag) en parameter doorgeven van dashboardprompt ernaar

  3. Oracle reguliere expressies. Gevaarlijk bereik

  4. Hoe kan ik IF ELSE CONDITION in Oracle-query plaatsen?