Vraag & Antwoord

Webprogrammeren & scripting

hoe ISA in databaseontwerp verwerken

6 antwoorden
  • ik heb al wat gegoogled maar daar niet kunnen vinden wat mij verder hielp. Wat het probleem is: hoe zet je een ISA structuur om in een databaseontwerp? Bijvoorbeeld: je wilt personen in een database stoppen (naam, adres, ...) Sommige van de personen zijn leden, anderen niet. Van leden sla je extra bijv lid_vanaf, geboorte_datum, type_lidmaatschap op, bij ander soort personen is dat helemaal niet van belang. Volgens de normalisatie-regels zou je nu de volgende tabellen maken: TABLE persoon ( persoon_id, naam, adres, ... KEY(persoon_id) ) TABLE lid ( persoon_id, lid_vanaf, type_lidmaatschap, ... KEY(persoon_id) FOREIGN KEY(persoon_id) REFERENCES persoon ) Ofwel: alle personen gaan in de tabel personen en leden krijgen bovendien een entry in de tabel leden. Nadelen: * een nieuw lid requires twee INSERTS (een in persoon, een in lid); UPDATE net zo iets * het opvragen van alle leden is een JOIN tussen lid en persoon maar alle niet-leden opvragen is dan al wat gecompliceerder Een andere optie is dan alles maar in 1 tabel te gooien maar met als nadelen: * veel lege velden (NULL; zonde van de ruimte, hoewel dat vaak niet echt een issue is) * wanneer iemand als lid wordt aangemerkt, moet er controle worden gedaan dat echt alle extra lid_velden zijn opgegeven * wanneer iemand niet als lid wordt aangemerkt, zijn er dus heel veel velden leeg, dat kan verwarring opbrengen. * wanneer voor anderen ook gegevens in een andere tabel zouden moeten worden opgeslagen, dan moet je evt een check doen dat iemand in ten minste of max 1 zo'n extra tabel voorkomt (zogenaamde overlapping/disjoint en covering/non-covering). Mijn vraag: wat is nu de beste weg, dwz makkelijk mee te werken in alle opzichten? Waarom vraag ik dit: ik ben bezig met een soort PHPMyAdmin-tool maar dan overzichtelijker dan wat ik tot nu toe heb kunnen vinden op Internet, zodanig dat je zelfs zonder weinig kennis van databases tabellen met foreign keys en bijv ISAstructuren kunt aanmaken. Ik merk dat ik zoiets erg vaak kort door de bocht programmeer maar wil t nu eens netjes doen. Maar ook als ik niet met deze tool bezig was, wilde ik het graag eens weten.
  • niemand hier een gedachte over?
  • (dubbelpost)
  • Ik heb hier zeker wel een gedachte over... ;) Kern van de gedachte is: er is niet één gedachte over. Ik zal reageren zodra ik nuchter ben en derhalve een helder en duidelijk antwoord zal kunnen plaatsen. (Ondanks het lelijke paarse gedrocht dat men reclame noemt.) - Bas
  • Ik heb er even een boek op nageslagen om het gelijk goed te zeggen, hieronder een citaat: "We can specify two kinds of constraints with respect to ISA hierarchies, namely, [i:8ff2457811]overlap[/i:8ff2457811] and [i:8ff2457811]covering[/i:8ff2457811] constraints. [b:8ff2457811]Overlap constraints[/b:8ff2457811] determine whether two subclasses are allowed to contain the same entity. [...] In the absence of such a statement, we assume by default that entity sets are constrained to have no overlap. [b:8ff2457811]Covering constraints[/b:8ff2457811] determine whether the entities in the subclasses collectively include all entities in the superclass. [...] In the absence of such a statement, we assume by default that there is no covering constraint." [size=9:8ff2457811]Bron: Database Management Systems, 3rd edition, Ramakrishnan & Gehrke, McGrawHill.[/size:8ff2457811] Met andere woorden: er zijn twee zaken waar je rekening mee moet houden bij het hebben van een ISA-relatie in je Entity Relationship Diagram (ERD). Ten eerste, mag een entiteit voorkomen in meerdere subklassen? Stel: je hebt een entiteit Werknemers en je hebt twee soorten werknemers welke je modelleert met een ISA-relatie. Een groep wordt betaald per uur (Werknemers_Uur) en een groep wordt betaald per project (Werknemers_Project). Kan iemand die betaald wordt per project (freelance?) ook betaald worden per uur? Afhankelijk van jouw interpretatie van het model komt dit anders terug in je database, maar in je ERD zie je het verschil niet. Ten tweede, moet een entiteit in de superklasse ook voorkomen in een subklasse? Nogmaals het voorbeeld van de eerdergenoemde werknemers. Zijn er werknemers die alleen voorkomen als Werknemers of moet iedereen in minimaal één van de subklassen voorkomen? Denk bijvoorbeeld aan bestuurders die een vast contract hebben en niet per uur betaald worden, maar dus ook niet per project. Ook hier is het verschil jouw interpretatie, dit heeft direct invloed op je database, maar het verschil zie je niet in je ERD. Het belangrijkste is dus dat je hier eerst goed over nadenkt. In het geval van [i:8ff2457811]full covering[/i:8ff2457811] en [i:8ff2457811]no overlap[/i:8ff2457811] zou je bijvoorbeeld (met nog steeds de werknemers) met twee tabellen afkunnen omdat het dan te definiëren valt als twee losstaande entiteiten. Heb je daarentegen veel [i:8ff2457811]overlap[/i:8ff2457811] en niet [i:8ff2457811]full covering[/i:8ff2457811] dan krijg je plotseling meer tabellen. Ook hangt het een en ander af van de mate waarin je normaliseert. Zoals ik dus al zei: er is niet één antwoord, het hangt allemaal af van een aantal aannames en uitgangspunten. Hopelijk kan je hier wat mee. - Bas.
  • dank voor dit antwoord. Dit zegt echter nog niet (volgens mij) hoe dit in een database te moddeleren. In mijn start-post had ik al een voorbeeld gegeven met mogeljike oplossingen met hun voor- en nadelen. Maar ik kan nog niet een conclusie trekken welke te kiezen. Het gaat mij dus om het geval non-covering/NaN (laatste is niet bekend want slechts 1 optie) maar eigenlijk ben ik naar alle combinaties wel benieuwd hoe dat in een db te zetten, ik kom alle wel eens tegen.

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.