Hva er eksklusiv lysbue i databasen, og hvorfor er det ' ondt?

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

  • De tre mulige lastebilstedene er underklasser av en superklasse, " lastebilplassering ". Det er mange tilfeller der underklasser utelukker hverandre. Utfordringen blir hvordan man modellerer klasser og underklasser i relasjonstabeller.
  • Jeg er enig i at det er tilfeller der bruk av dette designet er berettiget. Jeg kan imidlertid også være enig i det opprinnelige innlegget om at dette mønsteret brukes MYE mer enn det burde. Det har noen veldig store ulemper også …
  • Kan ikke en sjekkbegrensning brukes? For eksempel 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.
  • Derav " komplekse sjekkbegrensninger til tross for " fra innlegget sitert ovenfor. Du kan kanskje gjøre virkelig sofistikert validering med sjekkbegrensninger eller pokker, til og med utløsere, som ikke ' ikke gjør det til en god idé eller et tegn på god design. Tenk deg å gjøre sjekkbegrensninger på eksklusive buer med fire eller fem kolonner … Dessuten er jeg ' ganske sikker på at ikke alle databasemotorer støtter CHECK-begrensningen . MySQL sier eksplisitt i dokumentene at CHECK-klausuler er analysert, men ignoreres …
  • Denne kilden anbefaler eksklusiv bue. Tanker?

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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *