Skip to main content

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

  • Users is een centrale hub voor identiteit, audit, communicatie, tickets, oefenruns en beheeracties. Verwijzingen naar Users buiten het identity-domein zijn standaard soft links.
  • Roles en rolcontexten komen terug in relaties, autorisatie, live meekijken en audit. Verwijzingen naar Roles buiten het authorization-domein zijn standaard soft links, vaak met snapshot.
  • SystemMessages vormt een brug tussen relatie-, ticket-, privéthread- en gedeelde-oefeningflows via een beperkte logische verwijzing EntityType + EntityId.
  • ExerciseRuns vormt de historische bron voor resultaten, geschiedenis, PDF-export, gedeelde oefeningen en live meekijken.
  • PrivateMessageThreads wordt door ticket-doorzetflows gebruikt als regulier privéberichtkanaal, maar ticketdiscussie zelf blijft in het ticketdomein.
  • Configuratiebronnen zoals SystemMessageTemplates, PopupDetails, SiteNotifications, SiteFeatureToggles en ContentBlocks sturen 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.

BrontabelVeldVerwijst naarBrondocumentDoeldocument
UserSettingsSelectedTeacherLevelIdTeacherLevels.Id01_identiteit-en-autorisatie.md03_docentstructuur-en-leerlingtoegang.md
RelationshipInvitationsFromUserIdUsers.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
RelationshipInvitationsFromRoleIdRoles.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
RelationshipInvitationsToUserIdUsers.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
RelationshipInvitationsTargetRoleIdRoles.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
RelationshipInvitationsRespondedByUserIdUsers.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
UserRelationshipsFromUserIdUsers.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
UserRelationshipsFromRoleIdRoles.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
UserRelationshipsToUserIdUsers.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
UserRelationshipsToRoleIdRoles.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
UserRelationshipsInitiatedByUserIdUsers.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
UserRelationshipsInitiatedFromRoleIdRoles.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
UserRelationshipsDeactivatedByUserIdUsers.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
RelationshipEventsActorUserIdUsers.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
RelationshipEventsActorRoleIdRoles.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
RelationshipEventsTargetUserIdUsers.Id02_relatiebeheer.md01_identiteit-en-autorisatie.md
TeacherLevelsOwnerTeacherUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
TeacherLevelCollaboratorsCollaboratorTeacherUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
TeacherLevelCollaboratorsGrantedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
TeacherLevelCollaboratorsRevokedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
TeacherLevelOwnershipTransfersPreviousOwnerTeacherUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
TeacherLevelOwnershipTransfersNewOwnerTeacherUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
TeacherLevelOwnershipTransfersTransferredByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
CategoriesCreatedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
CategoriesUpdatedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
CategoryHistoryChangedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
ExercisesCreatedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
ExercisesUpdatedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
ExerciseHistoryChangedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
ExerciseModulesCreatedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
ExerciseModulesUpdatedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
LiveViewAuditViewerUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
LiveViewAuditViewerRoleIdRoles.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
LiveViewAuditObservedUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
LiveViewAuditExerciseRunIdExerciseRuns.Id03_docentstructuur-en-leerlingtoegang.md07_oefenruns-delen-en-voortgang.md
TeacherStudentLevelAccessTeacherStudentRelationshipIdUserRelationships.Id03_docentstructuur-en-leerlingtoegang.md02_relatiebeheer.md
TeacherStudentLevelAccessStudentUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
TeacherStudentLevelAccessGrantedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
TeacherStudentLevelAccessRevokedByUserIdUsers.Id03_docentstructuur-en-leerlingtoegang.md01_identiteit-en-autorisatie.md
SystemMessagesRecipientUserIdUsers.Id04_communicatie-en-notificaties.md01_identiteit-en-autorisatie.md
PrivateMessageThreadsCreatedByUserIdUsers.Id04_communicatie-en-notificaties.md01_identiteit-en-autorisatie.md
PrivateMessageThreadParticipantsUserIdUsers.Id04_communicatie-en-notificaties.md01_identiteit-en-autorisatie.md
PrivateMessagesSenderUserIdUsers.Id04_communicatie-en-notificaties.md01_identiteit-en-autorisatie.md
PrivateMessagesSendAsUserIdUsers.Id04_communicatie-en-notificaties.md01_identiteit-en-autorisatie.md
PrivateMessageThreadEventsActorUserIdUsers.Id04_communicatie-en-notificaties.md01_identiteit-en-autorisatie.md
PrivateMessageThreadEventsAffectedUserIdUsers.Id04_communicatie-en-notificaties.md01_identiteit-en-autorisatie.md
PopupDetailsUpdatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
PopupDetailsHistoryChangedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SiteFeatureTogglesUpdatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SystemSettingsUpdatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
ContentBlocksCreatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
ContentBlocksUpdatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
ContentBlockHistoryChangedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SiteLinksCreatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SiteLinksUpdatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SiteLinksDeletedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SiteLinkHistoryChangedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
FooterSectionsCreatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
FooterSectionsUpdatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
FooterSectionsDeletedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
FooterLinkAssignmentsCreatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
FooterLinkAssignmentsUpdatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
FooterLinkAssignmentsDeletedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
FooterLinkAssignmentHistoryChangedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SystemMessageTemplatesUpdatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SystemMessageTemplateHistoryChangedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SiteNotificationsCreatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SiteNotificationsUpdatedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SiteNotificationHistoryChangedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
SiteFeatureToggleHistoryChangedByUserIdUsers.Id05_configuratie-en-contentbeheer.md01_identiteit-en-autorisatie.md
TicketsCreatedByUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketsClosedByUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketAssignmentsAdminUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketAssignmentsAssignedByUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketAssignmentsUnassignedByUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketDiscussionMessagesCreatedByUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketHistoryActorUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketClosuresClosedByUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketClosuresAcceptedByUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketReopenRequestsRequestedByUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketForwardedToTeacherTeacherUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketForwardedToTeacherForwardedByAdminUserIdUsers.Id06_ticket-en-meldingsbeheer.md01_identiteit-en-autorisatie.md
TicketForwardedToTeacherGeneratedPrivateMessageThreadIdPrivateMessageThreads.Id06_ticket-en-meldingsbeheer.md04_communicatie-en-notificaties.md
TicketForwardedToTeacherGeneratedPrivateMessageIdPrivateMessages.Id06_ticket-en-meldingsbeheer.md04_communicatie-en-notificaties.md
ExerciseRunsUserIdUsers.Id07_oefenruns-delen-en-voortgang.md01_identiteit-en-autorisatie.md
ExerciseRunsLevelIdTeacherLevels.Id07_oefenruns-delen-en-voortgang.md03_docentstructuur-en-leerlingtoegang.md
ExerciseRunsCategoryIdCategories.Id07_oefenruns-delen-en-voortgang.md03_docentstructuur-en-leerlingtoegang.md
ExerciseRunsExerciseIdExercises.Id07_oefenruns-delen-en-voortgang.md03_docentstructuur-en-leerlingtoegang.md
ExerciseRunsExerciseModuleIdExerciseModules.Id07_oefenruns-delen-en-voortgang.md03_docentstructuur-en-leerlingtoegang.md
SharedExercisesSharedByUserIdUsers.Id07_oefenruns-delen-en-voortgang.md01_identiteit-en-autorisatie.md
SharedExercisesSharedToUserIdUsers.Id07_oefenruns-delen-en-voortgang.md01_identiteit-en-autorisatie.md
SharedExercisesDeletedByUserIdUsers.Id07_oefenruns-delen-en-voortgang.md01_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, ExerciseId en ExerciseModuleId zijn 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.
  • ExerciseRunProgress ondersteunt actuele voortgang, hervatten en live meekijken, terwijl ExerciseRuns de uniforme totalen en statistieken bevat.
  • SharedExercises bewaart de administratieve ontvangst en snapshots. De ontvanger krijgt pas bij start een eigen ExerciseRuns-record.
  • LiveViewAudit registreert 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:

  • RecipientUserId is een soft link naar identity.Users.Id; de ontvangercontrole gebeurt via applicatielogica en autorisatiecontext.
  • EntityType is een gesloten set en beperkt de toegestane doeltabellen.
  • EntityId krijgt betekenis door EntityType; 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 TicketDiscussionMessages en 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:

  • TicketDiscussionMessages en TicketHistory zijn bewust gescheiden: discussie bevat inhoud, history bevat compacte audit.
  • De actorrelaties naar Users zijn soft actor-/auditverwijzingen en betekenen niet dat Users functioneel eigenaar is van ticketrecords.
  • SystemMessages.EntityType = Ticket is 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 SystemMessageTemplates herschrijft bestaande SystemMessages niet.
  • SiteFeatureToggles mogen flows blokkeren, maar vervangen geen server-side autorisatiecontrole.
  • SiteNotifications zijn eigen frontpage-overlays en worden niet als mailboxitem opgeslagen.
  • ContentBlocks en 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:

  • Users is 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, FooterSections en FooterLinkAssignments beë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:

  • Users als 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.