Jeg leste de vanligste databasedesignfeilene som ble gjort av utvikleren Q & A om stackoverflow. Ved det første svaret var det setning om eksklusiv lysbue:
En eksklusiv lysbue er en vanlig feil der en tabell lages med to eller flere utenlandske nøkler der en og bare en av dem kan være ikke-null. Stor tabbe. For det første blir det mye vanskeligere å opprettholde dataintegriteten. Tross alt, selv med referanseintegritet, er det ingenting som forhindrer at to eller flere av disse fremmede nøklene blir satt (til tross for komplekse sjekkbegrensninger).
Jeg virkelig ikke «t forstå hvorfor eksklusiv lysbue er ond. Sannsynligvis skjønte jeg ikke det grunnleggende. Er det noen god forklaring på eksklusive buer?
Svar
Så vidt jeg forsto det for lenge siden, i et eksklusivt bue en tabell inneholder et antall kolonner som er fremmede nøkler til andre tabeller, men bare en av disse kan settes om gangen (på grunn av noen logiske begrensninger på domenet som følger fra den virkelige verden). Siden denne regelen ikke kan håndheves i databasen, kan det opprettes en korrupt post der mer enn en av disse fremmede nøklene har en verdi.
Jeg kommer til å lage et eksempel. Tenk på et program der et selskap holder styr på lastebilene den bruker for å levere varer. En lastebil kan bare være på ett av tre steder samtidig: det kan være med en ansatt, det kan være i et parkeringshus eller det kan være i en vedlikeholdsbutikk. Dette kan modelleres ved å ha et lastebiltabell med ansatteId, parkeringGarageId og vedlikeholdShopId, med henvisning til de ansatte, ParkingGarage og vedlikeholdShop-tabellene. Det er ingen måte å håndheve regelen om at bare ett av disse feltene er fylt ut på databasenivå. noen med direkte tilgang til databasen kan sette inn en post som har to eller tre felt fylt, noe som tilsvarer datakorrupsjon i databasen.
Kommentarer
Svar
Det er ikke noe ondt med eksklusive buer. Bare håndheve den tilsvarende forretningsregelen ved hjelp av en sjekkbegrensning. De fleste store databasesystemer støtter sjekkbegrensninger (Oracle, SQL Server, PostgreSQL). Hvis du bruker et datamodelleringsverktøy, er det en god sjanse for at verktøyet ditt automatisk genererer koden for å implementere sjekkbegrensningen.
Svar
Den eksklusive buen er veldig nyttig i det konseptuelle eller logiske designet. Det betyr ikke at du må implementere på den måten. I det tidligere eksemplet kan designeren bestemme seg for å implementere designet med tre bord. Ett for parkering sted, en for den ansatte og en for vedlikeholdsbutikken.
alter table mytable add constraint myconstraint check ((col1 is not null and col2 is null and col3 is null) or (col1 is null and col2 is not null and col3 is null) or (col1 is null and col2 is null and col3 is not null))
. Jeg liker ikke ', men de kan håndheves med en sjekkbegrensning. Selvfølgelig må FK-begrensningen også være tilstede.