Vad är exklusiv båge i databasen och varför är det '?

Jag läste de vanligaste databasdesignfelen från utvecklaren Q & A om stackoverflow. Vid det första svaret fanns frasen om exklusiv båge:

En exklusiv båge är ett vanligt misstag där en tabell skapas med två eller flera främmande nycklar där en och endast en av dem kan vara icke-null. Stort misstag. För det första blir det mycket svårare att upprätthålla dataintegriteten. När allt kommer omkring, även med referensintegritet, hindrar ingenting två eller flera av dessa främmande nycklar från att ställas in (trots komplexa kontrollbegränsningar).

Jag verkligen inte ”t förstår varför exklusiv båge är ond. Förmodligen förstod jag inte grunderna i den. Finns det någon bra förklaring på exklusiva bågar?

Svar

Så vitt jag förstod det för länge sedan, i ett exklusivt båge en tabell innehåller ett antal kolumner som är främmande nycklar till andra tabeller, men bara en av dessa kan ställas in åt gången (på grund av en viss logisk begränsning av domänen från den verkliga världen). Eftersom denna regel inte kan tillämpas i databasen kan en korrupt post skapas där mer än en av dessa främmande nycklar har ett värde.

Jag kommer att göra ett exempel. Tänk på en applikation där ett företag håller reda på lastbilarna som används för att leverera gods. En lastbil kan bara vara på en av tre platser samtidigt: det kan vara med en anställd, det kan vara i ett parkeringshus eller det kan vara i en underhållsbutik. genom att ha en lastbilstabell med medarbetar-id, parkeringGarageId och underhållShopId, med hänvisning till anställd, ParkingGarage och underhållShop-tabeller. Det finns inget sätt att genomdriva regeln att endast ett av dessa fält fylls i på databasen. Dålig kod eller någon med direkt åtkomst till databasen kan infoga en post som har två eller tre fält fyllda, vilket motsvarar dataskada i databasen.

Kommentarer

  • De tre möjliga lastbilsplatserna är underklasser av en superklass, " lastbilsläge ". Det finns många fall där underklasser utesluter varandra. Utmaningen blir hur man modellerar klasser och underklasser i relationstabeller.
  • Jag håller med om att det finns fall där det är motiverat att använda denna design. Jag kan dock också hålla med om det ursprungliga inlägget att detta mönster används mycket mer än det borde. Det har också några mycket stora nackdelar …
  • Kan inte en checkbegränsning användas? Till exempel 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)). Jag gillar ' inte exklusiva bågar men de kan genomföras med en kontrollbegränsning. Naturligtvis måste FK-begränsningen också vara närvarande.
  • Därav " komplexa kontrollbegränsningar trots " från inlägget ovan citerade. Du kanske kan göra riktigt sofistikerad validering med kontrollbegränsningar eller heck, till och med triggers, som inte ' gör det till en bra idé eller en symbol för bra design. Föreställ dig att du gör kontrollbegränsningar för exklusiva bågar med fyra eller fem kolumner … Jag ' är också ganska säker på att inte alla databasmotorer stödja CHECK-begränsningen . MySQL anger uttryckligen i dokumenten att CHECK-klausuler är analyserade, men ignoreras …
  • Den här källan rekommenderar exklusiv båge. Tankar?

Svar

Det finns inget ont om exklusiva bågar. Tillämpa bara motsvarande affärsregel med en kontrollbegränsning. De flesta större databashanteringssystem stöder kontrollbegränsningar (Oracle, SQL Server, PostgreSQL). Om du använder ett datamodelleringsverktyg är det stor chans att ditt verktyg automatiskt genererar koden för att implementera kontrollbegränsningen.

Svar

Den exklusiva bågen är mycket användbar i konceptuell eller logisk design. Det betyder inte att du måste implementera på det sättet. I det tidigare exemplet kan designern besluta att implementera designen med tre bord. En för parkering plats, en för medarbetaren och en för underhållsbutiken.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *