Skip to main content

13. Relatie-index

Deze relatie-index is een controleerbare tabelvorm naast de diagrammen. Diagrammen zijn bedoeld voor begrip; deze index is bedoeld om te controleren of een verwijzing als harde database-FK, soft link, soft link + snapshot, FK + snapshot of logische verwijzing bedoeld is.

Door de keuze voor een modulaire monoliet geldt: een functionele verwijzing is niet automatisch een harde database-FK. Harde foreign keys horen in principe binnen één module, één DbContext en één schema. Verwijzingen over modulegrenzen worden standaard als soft link of soft link + snapshot gedocumenteerd.

13.1 Interpretatie van relatietypen

Type relatieFK in veldtabelHoe herkennen?Waar documenteren?Hoe tekenen?
Harde FKJDe brontabel en doeltabel horen bij dezelfde module, DbContext en schema, of er is een expliciete uitzondering vastgelegd.Veldtabel, Foreign keys op databaseniveau en deze index.Normale crow's-foot ERD-relatie.
FK + snapshotJDomeininterne FK met aanvullende snapshotvelden voor historische leesbaarheid.Veldtabel, snapshottoelichting en deze index.FK tekenen; snapshot tekstueel toelichten.
Soft linkNVeld bevat een id uit een andere module, DbContext of schema.Veldtabel, Functionele / logische verwijzingen zonder harde FK en deze index.Flowchart, gestippelde contextlijn of tekstuele verwijzing.
Soft link + snapshotNCross-module id plus snapshotvelden die historische context vastleggen.Veldtabel, snapshottoelichting en deze index.Geen harde FK-lijn; soft link en snapshot samen benoemen.
Logische verwijzingNBetekenis ontstaat door applicatielogica, bijvoorbeeld EntityType + EntityId.Domeinpagina en cross-domeinpagina.Flowchart of gestippelde contextlijn.
Readmodel/tellerNWaarde wordt uit brondata afgeleid.Domeinpagina of readmodeldocumentatie.Niet als bronrelatie tekenen.

13.2 Harde FK-verwijzingen binnen modulegrenzen

Deze sectie bevat de harde FK-categorieën die binnen modulegrenzen blijven. De detailrijen blijven in de brondocumenten per databasehoofdstuk leidend en moeten dezelfde classificatie gebruiken.

Domein / schemaHarde FK-categorieënVoorbeeldenBron
identityProfiel- en gebruikersinstellingen binnen identity.Users.ProfileAvatarId -> ProfileAvatars.Id, UserSettings.UserId -> Users.Id wanneer UserSettings binnen identity blijft.01_identiteit-en-autorisatie.md
authorizationRol- en autorisatiebronnen binnen authorization.UserRoles.RoleId -> Roles.Id; de verwijzing naar Users.Id wordt als soft link naar identity beoordeeld wanneer UserRoles in authorization blijft.01_identiteit-en-autorisatie.md
relationshipsRelatiebronnen, uitnodigingen en relatie-events binnen relationships.RelationshipInvitations.RelationshipTypeId -> RelationshipTypes.Id, RelationshipEvents.RelationshipId -> UserRelationships.Id.02_relatiebeheer.md
catalogNiveaus, categorieën, oefeningen, modules en catalogushistorie binnen catalog.TeacherLevelCategories.TeacherLevelId -> TeacherLevels.Id, Exercises.ExerciseModuleId -> ExerciseModules.Id, ExerciseHistory.ExerciseId -> Exercises.Id.03_docentstructuur-en-leerlingtoegang.md
communicationPrivéthreads, deelnemers, berichten en thread-events binnen communication.PrivateMessages.ThreadId -> PrivateMessageThreads.Id, PrivateMessageThreadParticipants.ThreadId -> PrivateMessageThreads.Id.04_communicatie-en-notificaties.md
adminBeheerbare content, popups, footer, links, featuretoggles, notificaties en history binnen admin.PopupDetailsHistory.PopupDetailsId -> PopupDetails.Id, FooterLinkAssignments.SiteLinkId -> SiteLinks.Id.05_configuratie-en-contentbeheer.md
supportTickets, ticketstatussen, discussies, sluitingen, heropenverzoeken en technische snapshots binnen support.TicketAssignments.TicketId -> Tickets.Id, TicketClosures.ResolutionTypeId -> TicketResolutionTypes.Id.06_ticket-en-meldingsbeheer.md
practiceOefenruns, voortgang, gedeelde oefeningen en duplicaten binnen practice.ExerciseRunProgress.ExerciseRunId -> ExerciseRuns.Id, ExerciseRuns.DuplicateOfExerciseRunId -> ExerciseRuns.Id.07_oefenruns-delen-en-voortgang.md

Deze verwijzingen blijven functioneel belangrijk, maar worden niet als harde database-FK afgedwongen. De kolom Verwijst naar in de veldtabel mag gevuld blijven, terwijl FK = N wordt gebruikt en de opmerking expliciet de soft link benoemt.

BrondomeinVerwijzingstypeTypische veldenDoeldomeinReden voor soft link
Alle domeinenActor-, eigenaar-, deelnemer-, ontvanger- of beheerdervelden naar gebruikers.CreatedByUserId, ChangedByUserId, ClosedByUserId, RecipientUserId, TeacherUserId, StudentUserId.identity.Users.IdVoorkomt harde afhankelijkheid van identity en ondersteunt account lifecycle/anonimisering.
RelationshipsRolcontextvelden.FromRoleId, ToRoleId, ActorRoleId, TargetRoleId.authorization.Roles.IdRelatiebeheer gebruikt rolcontext, maar authorization blijft eigenaar van rollen.
AuthorizationGeselecteerde of geautoriseerde onderwijscontext.SelectedTeacherLevelId, niveau-autorisatievelden.catalog.TeacherLevels.IdAuthorization/context mag catalogusdata gebruiken zonder catalog als harde FK-afhankelijkheid.
PracticeHistorische runcontext.UserId, LevelId, CategoryId, ExerciseId, ExerciseModuleId.identity, catalogRuns moeten historisch leesbaar blijven na account-, catalogus- of modulewijzigingen.
LiveMonitoringMeekijkcontext.ViewerUserId, ObservedUserId, ViewerRoleId, ExerciseRunId.identity, authorization, practiceLive-audit moet domeinoverstijgend herleidbaar zijn zonder harde FK-koppeling.
SupportTicketactoren en gegenereerde communicatie.CreatedByUserId, AdminUserId, GeneratedPrivateMessageThreadId, GeneratedPrivateMessageId.identity, communicationSupport blijft eigenaar van ticketdata; communication blijft eigenaar van privéthreads.
AdminBeheeractoren.CreatedByUserId, UpdatedByUserId, DeletedByUserId, ChangedByUserId.identity.Users.IdBeheerhistorie blijft domeinspecifiek en mag identity niet hard koppelen.

Soft link + snapshot wordt gebruikt wanneer de actuele bron kan wijzigen of verdwijnen, terwijl historische weergave stabiel moet blijven.

Brontabel / modelSoft linkSnapshotvelden / contextDoel
ExerciseRunsUserId, LevelId, CategoryId, ExerciseId, ExerciseModuleIdleerling-/niveau-/categorie-/oefening-/modulecontext op de runResultaatweergave, geschiedenis, PDF-export en live meekijken blijven historisch juist.
SharedExercisesSharedByUserId, SharedToUserId, bronrun/contextveldentekstuele momentopname van gedeelde oefeningcontextOntvangen gedeelde oefeningen blijven herkenbaar na latere migraties of naamwijzigingen.
LiveViewAuditViewerUserId, ObservedUserId, ViewerRoleId, ExerciseRunIdViewerRoleNameSnapshot en sessiecontextMeekijkhistorie blijft leesbaar zonder harde FK naar identity/authorization/practice.
TicketTechnicalSnapshotsTicketId blijft domeinintern; technische context is snapshotuser agent, page URL, IP-adres, rollenmomentopnameTechnische context hoort bij het meldmoment en wordt niet live herberekend.

13.5 Logische verwijzingen zonder harde FK

BrontabelVeldenToegestane doelenValidatie
SystemMessagesEntityType + EntityIdRelationshipInvitations, Tickets, PrivateMessageThreads, SharedExercisesApplicatielogica valideert doeltabel, objectstatus en actuele rechten.
Beheerbare contentblokkenDomainType, ContextType, BlockKeyCodevaste frontpage- of vaste-paginapositiesApplicatielogica en beheerregels valideren bekende keys.
Popups/templates/features/settingsPopupKey, TemplateKey, FeatureKey, SettingKeyCodegedreven applicatiegebruikApplicatielogica gebruikt stabiele keys; geen generieke FK naar runtime-objecten.

13.6 Onderhoudsregel

Wanneer een veld functioneel naar een andere tabel verwijst, moet de database-informatie steeds expliciet maken of dit een harde FK, soft link, soft link + snapshot, FK + snapshot of logische verwijzing is. Een veld met FK = J mag door implementatie als database-foreign-key worden aangemaakt. Een veld met FK = N en gevulde Verwijst naar-kolom is een functionele verwijzing zonder harde FK; implementatie mag daar hoogstens indexen, applicatievalidatie en publieke modulecontracten op baseren.