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
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.
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.