sql >> Database teknologi >  >> RDS >> Sqlserver

Design af 1:1 og 1:m relationer i SQL Server

Ethvert forhold kræver, at "overordnet"-tabellen (den ene side) har en primær (eller unik) nøgle (PK), der unikt identificerer hver række, og "underordnet"-tabellen (den anden side) har en eller flere kolonner med fremmednøgle , der skal udfyldes med værdier, der er de samme som nogle eksisterende værdier af den primære nøgle i den overordnede tabel. Hvis du ønsker en en til mange (1-M) relation, skal fremmednøglen være en almindelig attribut (kolonne eller kolonner) i den underordnede tabel, der kan gentages (der kan være mange rækker med samme værdi)

Hvis du vil have en en til en (1-1) relation, skal den fremmede nøgle i sig selv være en primær nøgle eller et unikt indeks i den underordnede tabel, der garanterer, at der højst kan være én række i den underordnede tabel med den værdi.

Et 1-1 forhold opdeler effektivt attributterne (kolonnerne) i en tabel i to tabeller. Dette kaldes vertikal segmentering. Dette gøres ofte for underklassificering tabelentiteterne, eller af en anden årsag, hvis brugsmønstrene på kolonnerne i tabellen indikerer, at nogle få af kolonnerne skal tilgås væsentligt oftere end resten af ​​kolonnerne. (Sig at en eller to kolonner vil blive tilgået 1000-vis af gange i sekundet, og de andre 40 kolonner vil kun blive tilgået en gang om måneden). Opdeling af tabellen på denne måde vil faktisk optimere lagermønsteret for de to forskellige forespørgsler.

Underklasser . Ovenstående skaber faktisk en 1 til nul eller en relation, som bruges til det, der kaldes et underklasse- eller undertypeforhold. Dette sker, når du har to forskellige entiteter, der deler et stort antal attributter, men den ene af enhederne har yderligere attributter, som den anden ikke har brug for. Et godt eksempel kunne være Medarbejdere , og SalariedEmployees . Medarbejderen tabellen ville have alle de attributter, som alle medarbejdere deler, og SalariedEmployee tabel ville eksistere i et (1-0/1) forhold til medarbejdere med de yderligere attributter (Løn , Årlig ferie osv.), som kun funktionærer har brug for.

Hvis du virkelig ønsker en 1-1 relation, så skal du tilføje en anden mekanisme for at sikre, at den underordnede tabel altid vil have én post for hver post/række i den overordnede tabel. Generelt er den eneste måde at gøre dette på ved at håndhæve dette i den kode, der bruges til at indsætte data (enten i en trigger, lagret procedure eller kode uden for databasen). Dette skyldes, at hvis du tilføjede referenceintegritetsbegrænsninger på to tabeller, der kræver, at rækker altid er i begge, ville det ikke være muligt at tilføje en række til nogen af ​​dem uden at overtræde en af ​​begrænsningerne, og du kan ikke tilføje en række til begge. borde på samme tid.



  1. Brug af MySQL LOAD DATA INFILE med ikke-udskrivbare tegnafgrænsere

  2. søg fra flere tabeller ved hjælp af et enkelt søgeord i mysql

  3. JSON_OBJECT() Funktion i Oracle

  4. Brug af LogMiner til at finde aktuelle ændringer