12. Cross-domein relaties
Deze pagina verzamelt relaties waarbij een tabel uit het ene databasehoofdstuk functioneel verwijst naar een tabel uit een ander hoofdstuk. Door de modulaire monoliet zijn dit standaard soft links, soft links met snapshot of logische verwijzingen, tenzij het brondocument expliciet een harde FK-uitzondering vastlegt. Dit voorkomt dat domeindiagrammen onleesbaar worden door alle externe lijnen mee te tekenen en voorkomt dat cross-module verwijzingen als harde database-FK worden gelezen.
12.1 Belangrijkste aandachtspunten
Usersis een centrale hub voor identiteit, audit, communicatie, tickets, oefenruns en beheeracties. Verwijzingen naarUsersbuiten het identity-domein zijn standaard soft links.Rolesen rolcontexten komen terug in relaties, autorisatie, live meekijken en audit. Verwijzingen naarRolesbuiten het authorization-domein zijn standaard soft links, vaak met snapshot.SystemMessagesvormt een brug tussen relatie-, ticket-, privéthread- en gedeelde-oefeningflows via een beperkte logische verwijzingEntityType+EntityId.ExerciseRunsvormt de historische bron voor resultaten, geschiedenis, PDF-export, gedeelde oefeningen en live meekijken.PrivateMessageThreadswordt door ticket-doorzetflows gebruikt als regulier privéberichtkanaal, maar ticketdiscussie zelf blijft in het ticketdomein.- Configuratiebronnen zoals
SystemMessageTemplates,PopupDetails,SiteNotifications,SiteFeatureTogglesenContentBlockssturen runtimegedrag, maar zijn meestal niet hard gekoppeld aan de runtime-objecten die zij beïnvloeden.
12.2 Cross-domein verwijzingsoverzicht
Dit overzicht benoemt functionele verwijzingen tussen databasehoofdstukken. De tabel is geen lijst met harde database-FK's. De technische classificatie volgt uit de brondocumenten en de relatie-index: cross-domein verwijzingen zijn standaard soft link of soft link + snapshot.
| Brontabel | Veld | Verwijst naar | Brondocument | Doeldocument |
|---|---|---|---|---|
UserSettings | SelectedTeacherLevelId | TeacherLevels.Id | 01_identiteit-en-autorisatie.md | 03_docentstructuur-en-leerlingtoegang.md |
RelationshipInvitations | FromUserId | Users.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
RelationshipInvitations | FromRoleId | Roles.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
RelationshipInvitations | ToUserId | Users.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
RelationshipInvitations | TargetRoleId | Roles.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
RelationshipInvitations | RespondedByUserId | Users.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
UserRelationships | FromUserId | Users.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
UserRelationships | FromRoleId | Roles.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
UserRelationships | ToUserId | Users.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
UserRelationships | ToRoleId | Roles.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
UserRelationships | InitiatedByUserId | Users.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
UserRelationships | InitiatedFromRoleId | Roles.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
UserRelationships | DeactivatedByUserId | Users.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
RelationshipEvents | ActorUserId | Users.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
RelationshipEvents | ActorRoleId | Roles.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
RelationshipEvents | TargetUserId | Users.Id | 02_relatiebeheer.md | 01_identiteit-en-autorisatie.md |
TeacherLevels | OwnerTeacherUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
TeacherLevelCollaborators | CollaboratorTeacherUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
TeacherLevelCollaborators | GrantedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
TeacherLevelCollaborators | RevokedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
TeacherLevelOwnershipTransfers | PreviousOwnerTeacherUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
TeacherLevelOwnershipTransfers | NewOwnerTeacherUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
TeacherLevelOwnershipTransfers | TransferredByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
Categories | CreatedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
Categories | UpdatedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
CategoryHistory | ChangedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
Exercises | CreatedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
Exercises | UpdatedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
ExerciseHistory | ChangedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
ExerciseModules | CreatedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
ExerciseModules | UpdatedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
LiveViewAudit | ViewerUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
LiveViewAudit | ViewerRoleId | Roles.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
LiveViewAudit | ObservedUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
LiveViewAudit | ExerciseRunId | ExerciseRuns.Id | 03_docentstructuur-en-leerlingtoegang.md | 07_oefenruns-delen-en-voortgang.md |
TeacherStudentLevelAccess | TeacherStudentRelationshipId | UserRelationships.Id | 03_docentstructuur-en-leerlingtoegang.md | 02_relatiebeheer.md |
TeacherStudentLevelAccess | StudentUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
TeacherStudentLevelAccess | GrantedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
TeacherStudentLevelAccess | RevokedByUserId | Users.Id | 03_docentstructuur-en-leerlingtoegang.md | 01_identiteit-en-autorisatie.md |
SystemMessages | RecipientUserId | Users.Id | 04_communicatie-en-notificaties.md | 01_identiteit-en-autorisatie.md |
PrivateMessageThreads | CreatedByUserId | Users.Id | 04_communicatie-en-notificaties.md | 01_identiteit-en-autorisatie.md |
PrivateMessageThreadParticipants | UserId | Users.Id | 04_communicatie-en-notificaties.md | 01_identiteit-en-autorisatie.md |
PrivateMessages | SenderUserId | Users.Id | 04_communicatie-en-notificaties.md | 01_identiteit-en-autorisatie.md |
PrivateMessages | SendAsUserId | Users.Id | 04_communicatie-en-notificaties.md | 01_identiteit-en-autorisatie.md |
PrivateMessageThreadEvents | ActorUserId | Users.Id | 04_communicatie-en-notificaties.md | 01_identiteit-en-autorisatie.md |
PrivateMessageThreadEvents | AffectedUserId | Users.Id | 04_communicatie-en-notificaties.md | 01_identiteit-en-autorisatie.md |
PopupDetails | UpdatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
PopupDetailsHistory | ChangedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SiteFeatureToggles | UpdatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SystemSettings | UpdatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
ContentBlocks | CreatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
ContentBlocks | UpdatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
ContentBlockHistory | ChangedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SiteLinks | CreatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SiteLinks | UpdatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SiteLinks | DeletedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SiteLinkHistory | ChangedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
FooterSections | CreatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
FooterSections | UpdatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
FooterSections | DeletedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
FooterLinkAssignments | CreatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
FooterLinkAssignments | UpdatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
FooterLinkAssignments | DeletedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
FooterLinkAssignmentHistory | ChangedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SystemMessageTemplates | UpdatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SystemMessageTemplateHistory | ChangedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SiteNotifications | CreatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SiteNotifications | UpdatedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SiteNotificationHistory | ChangedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
SiteFeatureToggleHistory | ChangedByUserId | Users.Id | 05_configuratie-en-contentbeheer.md | 01_identiteit-en-autorisatie.md |
Tickets | CreatedByUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
Tickets | ClosedByUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
TicketAssignments | AdminUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
TicketAssignments | AssignedByUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
TicketAssignments | UnassignedByUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
TicketDiscussionMessages | CreatedByUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
TicketHistory | ActorUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
TicketClosures | ClosedByUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
TicketClosures | AcceptedByUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
TicketReopenRequests | RequestedByUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
TicketForwardedToTeacher | TeacherUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
TicketForwardedToTeacher | ForwardedByAdminUserId | Users.Id | 06_ticket-en-meldingsbeheer.md | 01_identiteit-en-autorisatie.md |
TicketForwardedToTeacher | GeneratedPrivateMessageThreadId | PrivateMessageThreads.Id | 06_ticket-en-meldingsbeheer.md | 04_communicatie-en-notificaties.md |
TicketForwardedToTeacher | GeneratedPrivateMessageId | PrivateMessages.Id | 06_ticket-en-meldingsbeheer.md | 04_communicatie-en-notificaties.md |
ExerciseRuns | UserId | Users.Id | 07_oefenruns-delen-en-voortgang.md | 01_identiteit-en-autorisatie.md |
ExerciseRuns | LevelId | TeacherLevels.Id | 07_oefenruns-delen-en-voortgang.md | 03_docentstructuur-en-leerlingtoegang.md |
ExerciseRuns | CategoryId | Categories.Id | 07_oefenruns-delen-en-voortgang.md | 03_docentstructuur-en-leerlingtoegang.md |
ExerciseRuns | ExerciseId | Exercises.Id | 07_oefenruns-delen-en-voortgang.md | 03_docentstructuur-en-leerlingtoegang.md |
ExerciseRuns | ExerciseModuleId | ExerciseModules.Id | 07_oefenruns-delen-en-voortgang.md | 03_docentstructuur-en-leerlingtoegang.md |
SharedExercises | SharedByUserId | Users.Id | 07_oefenruns-delen-en-voortgang.md | 01_identiteit-en-autorisatie.md |
SharedExercises | SharedToUserId | Users.Id | 07_oefenruns-delen-en-voortgang.md | 01_identiteit-en-autorisatie.md |
SharedExercises | DeletedByUserId | Users.Id | 07_oefenruns-delen-en-voortgang.md | 01_identiteit-en-autorisatie.md |
12.3 Thematisch diagram: oefenruns als historische resultaatbron
ExerciseRuns is een goed voorbeeld van een tabel die functioneel in één domein staat, maar relaties heeft naar meerdere andere domeinen. Het onderstaande diagram is bewust geen volledig ERD; het toont alleen waarom oefenruns als historische bron worden behandeld.
Belangrijk in dit patroon:
UserId,LevelId,CategoryId,ExerciseIdenExerciseModuleIdzijn soft links met historische contextvelden op de run. Zij worden niet via harde cross-module FK's afgedwongen en worden niet herschreven door latere migraties of naamswijzigingen.ExerciseRunProgressondersteunt actuele voortgang, hervatten en live meekijken, terwijlExerciseRunsde uniforme totalen en statistieken bevat.SharedExercisesbewaart de administratieve ontvangst en snapshots. De ontvanger krijgt pas bij start een eigenExerciseRuns-record.LiveViewAuditregistreert meekijken, maar schrijft geen antwoorden, scores of voortgang.
12.4 Thematisch diagram: systeemberichten als beperkte domeinverwijzing
SystemMessages heeft een soft link naar de ontvanger in identity.Users en daarnaast één beperkte logische verwijzing naar vier toegestane domeinobjecttypen. Dit diagram gebruikt daarom een flowchart en geen puur ERD: de stippellijnen zijn geen database-FK's.
Belangrijk in dit patroon:
RecipientUserIdis een soft link naaridentity.Users.Id; de ontvangercontrole gebeurt via applicatielogica en autorisatiecontext.EntityTypeis een gesloten set en beperkt de toegestane doeltabellen.EntityIdkrijgt betekenis doorEntityType; de database kan dit niet als één harde FK afdwingen.- Het openen van een systeembericht voert de onderliggende domeinactie niet automatisch uit.
- De vervolgcontext voert altijd opnieuw autorisatie en objectstatuscontrole uit.
12.5 Thematisch diagram: ticket-doorzetting naar privébericht
Ticketdiscussie en privéberichten blijven gescheiden domeinen. Alleen de expliciete doorzet-naar-docentflow mag vanuit het ticketdomein een reguliere privéberichtthread en een privébericht genereren.
Belangrijk in dit patroon:
- De gegenereerde privéthread blijft een normale
PrivateMessageThreads-thread. - Het gegenereerde privébericht blijft een normaal
PrivateMessages-record. - De namens-weergave wordt gedragen door het privéberichtmodel, niet door een apart ticketberichttype.
- Interne ticketdiscussie blijft in
TicketDiscussionMessagesen wordt niet naar privéberichten gekopieerd.
12.6 Thematisch diagram: ticket-lifecycle en actoren
Tickets staat in het ticketdomein, maar de meeste ticketmutaties verwijzen naar Users als melder, beheerder, sluitactor, acceptatieactor of docent. Daarom is dit patroon opgesplitst in een ERD-deel voor de harde ticketrelaties binnen support en een flowchart-deel voor soft actorverwijzingen en de logische systeemberichtroute.
Belangrijk in dit patroon:
TicketDiscussionMessagesenTicketHistoryzijn bewust gescheiden: discussie bevat inhoud, history bevat compacte audit.- De actorrelaties naar
Userszijn soft actor-/auditverwijzingen en betekenen niet datUsersfunctioneel eigenaar is van ticketrecords. SystemMessages.EntityType = Ticketis geen klassieke FK vanuit tickets, maar een beperkte logische routering vanuit het communicatiedomein.- Doorzetten naar docent maakt een privébericht mogelijk, maar maakt geen nieuwe docent-leerlingrelatie en wijzigt geen ticketdiscussie naar privéberichtinhoud.
12.7 Thematisch diagram: configuratiebronnen naar runtimegedrag
Configuratie en contentbeheer bevat veel tabellen die functioneel belangrijk zijn voor andere domeinen, maar die niet als harde FK naar die domeinen hoeven te wijzen. Dit diagram toont daarom expliciet het verschil tussen beheerbare brondata en runtime-effect.
Belangrijk in dit patroon:
- De stippellijnen zijn functionele gebruiksrelaties en geen database-FK's.
- Een wijziging in
SystemMessageTemplatesherschrijft bestaandeSystemMessagesniet. SiteFeatureTogglesmogen flows blokkeren, maar vervangen geen server-side autorisatiecontrole.SiteNotificationszijn eigen frontpage-overlays en worden niet als mailboxitem opgeslagen.ContentBlocksen footerrecords bepalen tekst en linkplaatsing binnen codevaste pagina's; zij zijn geen vrije pagebuilder.
12.8 Thematisch diagram: configuratiebeheer en Users als actorhub
Het configuratiedomein heeft veel cross-domein verwijzingen naar Users, maar vrijwel allemaal als beheer- of auditactor. Dit is een ander soort relatie dan bijvoorbeeld een leerling die een run maakt of een melder die een ticket aanmaakt.
Belangrijk in dit patroon:
Usersis hier vooral actor voor beheerbaarheid en audit. Deze velden zijn soft links naar identity.- Historytabellen leggen veldwijzigingen vast en zijn geen alternatieve bron voor actuele configuratie.
- Soft-deleteactoren bij
SiteLinks,FooterSectionsenFooterLinkAssignmentsbeëindigen zichtbaarheid, maar verwijderen de historische context niet.
12.9 Audit- en historypatronen over domeinen heen
Veel cross-domeinlijnen lopen via auditvelden naar Users. Die lijnen zijn standaard soft links en betekenen meestal niet dat Users functioneel eigenaar is van het record, maar dat de gebruiker actor, ontvanger, deelnemer, behandelaar, beheerder of bekeken gebruiker was.
Bij review van cross-domeinrelaties geldt daarom deze leesregel: een verwijzing naar Users is standaard een soft actor- of contextrelatie, tenzij het brondocument expliciet een harde FK-uitzondering vastlegt.
Logische verwijzingen blijven apart
Niet alle cross-domeinrelaties zijn FK's. De belangrijkste bewuste uitzondering blijft SystemMessages.EntityType + EntityId. Die combinatie kan naar RelationshipInvitations, Tickets, PrivateMessageThreads of SharedExercises verwijzen en wordt in applicatielogica gevalideerd. In ERD's wordt dit patroon daarom als flowchart of gestippelde contextlijn getoond, niet als gewone crow's-foot-relatie.
Snapshots beschermen historische leesbaarheid
Cross-domein snapshots zijn toegestaan wanneer actuele brondata kan wijzigen, maar de historische weergave stabiel moet blijven. Voorbeelden zijn LiveViewAudit.ViewerRoleNameSnapshot, technische ticketmomentopnamen en gedeelde-oefening-snapshots. Een snapshot is dus geen alternatieve bron voor autorisatie; autorisatie blijft in de relevante brontabellen en business rules.
12.10 Onderhoudsrichtlijn
Wanneer cross-domeinverwijzingen worden toegevoegd of gewijzigd, moet eerst worden bepaald of de verwijzing een harde FK-uitzondering, soft link, soft link + snapshot of logische verwijzing is. Gebruik daarbij de volgende thematische invalshoeken:
Usersals centrale identity hub.- Communicatieverwijzingen vanuit relaties, tickets en gedeelde oefeningen.
- Oefenrunverwijzingen naar niveau, categorie, oefening en module.
- Configuratiebronnen naar runtimegedrag en feature gates.
- Audit- en historytabellen per brondomein.