Ik las de meest voorkomende fouten in databaseontwerp gemaakt door ontwikkelaar Q & A op stackoverflow. Bij het eerste antwoord was er een zin over exclusieve boog:
Een exclusieve boog is een veelgemaakte fout wanneer een tabel wordt gemaakt met twee of meer externe sleutels waarbij één en slechts één ervan kan niet-nul zijn. Grote fout. Om te beginnen wordt het veel moeilijker om de gegevensintegriteit te behouden. Immers, zelfs met referentiële integriteit, verhindert niets dat twee of meer van deze externe sleutels worden ingesteld (ondanks complexe controlebeperkingen).
Echt niet “Ik begrijp niet waarom exclusieve boog slecht is. Waarschijnlijk begreep ik de basis ervan niet. Is er een goede uitleg over exclusieve bogen?
Antwoord
Voor zover ik het lang geleden begreep, in een exclusieve arc a table bevat een aantal kolommen die refererende sleutels zijn voor andere tabellen, maar er kan er maar één tegelijk worden ingesteld (vanwege een logische beperking op het domein die volgt uit de echte wereld). Aangezien deze regel niet kan worden afgedwongen in de database, kan een beschadigd record worden aangemaakt als meer dan één van deze externe sleutels een waarde heeft.
Ik zal een voorbeeld geven. Beschouw een toepassing waarbij een bedrijf de vrachtwagens die het gebruikt om goederen af te leveren. Een vrachtwagen kan maar op een van de drie plaatsen tegelijk zijn: het kan bij een medewerker zijn, het kan in een parkeergarage staan of het kan in een onderhoudswerkplaats zijn. Dit kan worden gemodelleerd door een Truck-table te hebben met employeeId, parkingGarageId en maintenanceShopId, verwijzend naar de Employee, ParkingGarage en MaintenanceShop-tabellen. Er is geen manier om de regel af te dwingen dat slechts één van deze velden wordt ingevuld op het niveau van de database. Onjuiste code of iemand met directe toegang tot de database zou een record kunnen invoegen waarvan twee of drie velden zijn ingevuld, wat neerkomt op gegevensbeschadiging in de database.
Opmerkingen
Antwoord
Er is niets kwaads aan exclusieve bogen. Dwing gewoon de bijbehorende bedrijfsregel af met behulp van een controlevoorwaarde. De meeste grote databasebeheersystemen ondersteunen controlebeperkingen (Oracle, SQL Server, PostgreSQL). Als u een datamodelleringstool gebruikt, is de kans groot dat uw tool automatisch de code genereert om de controlebeperking te implementeren.
Antwoord
De exclusieve boog is erg handig in het conceptuele of logische ontwerp. Het betekent niet dat je die manier moet implementeren. In het eerdere voorbeeld kan de ontwerper besluiten om het ontwerp met drie tafels te implementeren. Een voor parkeren locatie, een voor de medewerker en een voor de onderhoudswerkplaats.
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))
. Ik hou niet van ' exclusieve bogen, maar ze kunnen worden afgedwongen met een controlebeperking. Natuurlijk moet de FK-beperking ook aanwezig zijn.