Laat ik ook eens antwoord geven op het topic van deze thread, tenslotte het topic

Verwijderd schreef op donderdag 11 maart 2010 @ 14:57:
Beste mensen,
ik volg een opleiding BI en hierbij krijgen we veel te maken met databases, later wil ik hier zeer waarschijnlijk ook iets mee gaan doen. Alleen heb ik ooit nog wat moeite met het analyseren van relaties,m.n. in welke tabellen er foreiyn keys voor moeten komen. Mijn vraag is nu eigenlijk hoe kijken jullie hier tegen aan en dus hoe analyseren jullie deze relaties. Doen jullie dat bijvoorbeeld met de kennis van SQL in je achterhoofd om zo te controleren of de relaties kloppen, of hebben jullie er andere methodes voor? Er zijn natuurlijk wel een aantal standaard regeltjes voor dat bijvoorbeeld de child de primary key van de parent als foreiyn key mee krijgt en een koppeltabel de primary keys van de twee verbonden tabellen, maar dit zal niet altijd in praktijk werken.
Het moet wel zo werken iedere andere benadering is niet een juiste projectie.
Je moet wel 'parent' en 'child' loslaten, want er is geen hierarchie, maar alleen een aantal entities met relaties. Het concept 'FK
constraint' is puur uit referential integrity oogpunt geimplementeerd: Op table niveau (== projectie resultaat van abstract entity model op relational schema): Order heeft een relatie met Customer, en dat geef je aan door de identifying attribute(s) van Customer (de 'pk') op te nemen in Order. Om te voorkomen dat de data inconsistent wordt, en dus dat je bv een waarde voor de customer 'pk' velden in Order kunt plaatsen waar geen bestaande customer mee wordt geidentificeerd, zijn er referential integrity constraints bedacht, een constraint dus die voorschrijft dat een waarde in een FK field een gerelateerde row (== entity instance) identificeert.
Op het niveau van het abstract entity model (bv op het niveau van NIAM/ORM (object role modeling), zie
www.orm.net) heeft de 'fk' side van een relatie geen 'fk fields', oftewel de identifying attributes van de pk side zijn niet gecopieerd in de fk side entity. Dit is louter een relational model constructie en zijn het gevolg van de projectie van een abstract entity model op het relational model, dus dat je van abstract entity definitions naar table definitions gaat met FK constraints, PK constraints, Unique constraints en als je wilt, check constraints.
Een 'm:n' relatie kun je op 2 manieren maken op relational model niveau: via een 'intermediate entity' of koppeltabel die 2 m:1 relaties met elkaar verbindt, of middels een join van twee sets over een join clause waarbij niet een unique (pk/uc) constraint wordt gebruikt. Dit geeft meteen aan dat een m:n relatie feitelijk een interpretatie is van of 2 m:1 relaties, of een interpretatie is van een set verkregen door het joinen over non-gerelateerde attributes en feitelijk dus readonly is.
Het abstract entity model kun je ook projecteren op code, bv classes in een OO taal. Hierbij kun je bv dicht bij het abstract entity model blijven en bv geen kopieen van de identifying attributes in de FK side entity representerende class op te nemen, of je kunt dat juist wel doen waardoor je dichter bij de sibling projectie blijft, nl. die op de relational model (de table structure). Je kunt ook extreem de OO kant opgaan en bv een relatie als fysiek object gaan zien, ipv een associatie tussen twee objects beschouwen als een relatie instantie.
O/R mapping is dan het mechanisme waarbij beide projecties gekoppeld worden zodat de instances aan beide kanten (class instance == object en table def instance == table) dezelfde betekenis geven aan de data die ze in zich dragen (de entity 'instance'). Het hangt dus van de gebruikte O/R mapper af of je bv aan de code-kant foreign key fields hebt of dat je bv myOrder.Customer.ID moet uitlezen om de Fk field 'CustomerId' voor een Order instance te weten te komen. Aan de relational model kant wordt het wat lastiger om FK fields te negeren, of FK constraints (wat soms gedaan wordt, om performance redenen, die IMHO ondergeschikt moeten zijn tov data integrity regels, immers als je data inconsistent is dan heb je er niets meer aan) niet toe te passen: immers ergens moet je opslaan bij welke customer een zekere order row behoort.
In extreme gevallen wordt dit in een 3de tabel geplaatst, bv wanneer het systeem de tabellen dynamisch moet kunnen aanpassen aan de wensen van de gebruiker, waardoor men vaak relationele informatie opslaat buiten de tabellen met de entity data. Niet aan te bevelen, want je bouwt feitelijk een database in een database, maar voor extreme gevallen (en een beperkte set tabellen) is het soms feitelijk de enige keuze.
Wellicht handig om je docent te vragen iets meer uit te leggen over Codd's systeem en de paper van Peter Chen omtrent entity models?
Peter Chen: The Entity-Relationship Model-Toward a Unified View of Data:
http://www.csc.lsu.edu/news/erd.pdf
Edgar Codd: A Relational Model of Data for Large Shared Data Banks:
http://www.cs.nott.ac.uk/~nza/G51DBS/codd.pdf
Ik ben zelf erg gecharmeerd van T.A. Halpin's werk:
http://www.orm.net