8. Configuratie en contentbeheer
Deze pagina is de ERD-inzoomlaag voor het databasehoofdstuk 05_configuratie-en-contentbeheer.md. De tabeldefinities in dat brondocument blijven leidend; deze pagina biedt een leesbare visuele ingang en onderscheidt beheerbare brondata, history, codegedreven sleutelsets en runtime-effecten.
8.1 Doel van deze inzoomlaag
Configuratie en contentbeheer is geen éénvormig transactiedomein. Het bestaat uit meerdere beheerclusters die functioneel verschillende dingen sturen:
- popupdefinities voor gebruikersfeedback;
- featuretoggles en systeeminstellingen voor sitebreed gedrag;
- contentblokken voor frontpages, vaste pagina's en footercontent;
- links en footerplaatsingen voor beheerbare navigatiecontent;
- systeemberichttemplates voor inhoud van codegedreven systeemcommunicatie;
- sitebrede systeemnotificaties voor tijdelijke overlays na frontpageload;
- historytabellen om beheerwijzigingen op veldniveau herleidbaar te houden.
De belangrijkste ontwerpkeuze is dat deze tabellen beheerbare configuratiebrondata zijn. Zij zijn meestal niet zelf het runtime-object dat een gebruiker ontvangt. Een SystemMessageTemplate is bijvoorbeeld geen mailboxbericht; een PopupDetails-record is geen ticket- of berichtrecord; en een SiteNotification is geen SystemMessage.
8.2 Interne kern-ERD: popups, content, links en footer
Onderstaand diagram toont de harde interne relaties voor beheerbare pagina- en feedbackcontent. Actorverwijzingen naar Users zijn hier bewust weggelaten; die staan in de actor- en auditcontext.
Deze drie clusters horen functioneel bij zichtbare content: popups, tekstblokken en footer-/linkplaatsingen. De splitsing voorkomt dat de bredere configuratietabellen het content-ERD onleesbaar maken.
8.3 Interne kern-ERD: templates, notificaties, features en instellingen
Dit tweede interne diagram toont de configuratiebronnen die runtimegedrag of communicatie-inhoud sturen. Ook hier blijven actorverwijzingen naar Users buiten beeld.
8.4 Beheerclusters
| Cluster | Brontabellen | Waarvoor gebruiken? | Belangrijkste aandachtspunt |
|---|---|---|---|
| Popupregister | PopupDetails, PopupDetailsHistory, PopupDetailsHistoryItems | Beheerbare tekst, knoplabels en beperkte inputdefinitie van bestaande popups. | Nieuwe popupkeys en custom renderers blijven code/migratiegedreven. |
| Features en instellingen | SiteFeatureToggles, SiteFeatureToggleHistory, SystemSettings | Sitebrede aan/uit-schakelaars en niet-booleaanse systeemwaarden. | Uitschakelen verwijdert geen domeindata; setting keys zijn vooraf bekend. |
| Contentblokken | ContentBlocks, ContentBlockHistory | Tekstuele inhoud voor frontpages, vaste pagina's en footertekst. | Geen pagebuilder: layout, volgorde en rendering blijven codevast. |
| Footer en links | SiteLinks, SiteLinkHistory, FooterSections, FooterLinkAssignments, FooterLinkAssignmentHistory | Herbruikbare URLs, footersecties en linkplaatsing per context/kolom. | URL-records mogen pas verwijderd worden wanneer zij nergens gebruikt worden. |
| Systeemberichttemplates | SystemMessageTemplates, SystemMessageTemplateHistory | Beheerbare inhoud van bestaande systeemcommunicatie. | Template is geen verzonden bericht; verzending maakt runtime SystemMessages. |
| Sitebrede systeemnotificaties | SiteNotifications, SiteNotificationHistory | Tijdelijke of geplande overlays voor een doelgroep na frontpageload. | Geen mailboxbericht en geen popupregister-popup; displayregel bepaalt herhaling. |
8.5 Actor- en auditcontext
Bijna alle beheerbare tabellen verwijzen naar Users voor aanmaak, laatste wijziging, verwijdering of history. Deze actorverwijzingen zijn soft links naar identiteit/autorisatie en worden daarom in compacte groepen getoond. Zij zijn geen harde database-FK’s.
8.5.1 Actorverwijzingen op contentrecords
8.5.2 Actorverwijzingen op runtimeconfiguratie
8.5.3 Actorverwijzingen op historyrecords
Lees deze diagrammen niet als eigenaarschap van content door gebruikers. Het zijn beheer- en auditverwijzingen als soft links: wie heeft een record aangemaakt, gewijzigd, verwijderd of als historyregel vastgelegd. De geldigheid wordt via applicatielogica en autorisatie gecontroleerd, niet via een harde database-FK naar identity.
8.6 Functionele runtime-effecten
Configuratie/contentbeheer beïnvloedt andere domeinen, maar doet dat meestal via applicatielogica en niet via harde FK's. Daarom is een flowchart hier duidelijker dan een puur ERD.
Belangrijk in dit patroon:
SystemMessageTemplatesleveren inhoud voor toekomstige systeemcommunicatie, maar verwijzen niet hard naar individueleSystemMessages.SiteFeatureToggleskunnen flows blokkeren of beschikbaar maken, maar zijn geen autorisatiebron en wijzigen geen bestaande domeindata.PopupDetailsleveren gebruikersfeedback voor veel domeinen, maar maken geen ticket, bericht of auditrecord aan.SiteNotificationszijn eigen frontpage-overlays. Zij zijn niet hetzelfde als mailbox-systeemberichten en ook niet hetzelfde als popupregister-popups.ContentBlocksen footerrecords leveren tekstuele renderbrondata; zij bepalen geen routeautorisatie.
8.7 Lifecycle: contentblok wijzigen
Contentblokken vormen een uniform tekstueel beheermodel, maar geen vrije pagebuilder. DomainType, ContextType en BlockKey zijn stabiele ankers waarmee code bepaalt waar de tekst terechtkomt.
8.8 Lifecycle: footerlink plaatsen of verwijderen
Een SiteLinks-record is herbruikbaar. De plaatsing in de footer ontstaat pas via FooterLinkAssignments. Daardoor kan dezelfde URL in meerdere contexten of kolommen voorkomen zonder de URL zelf te dupliceren.
8.9 Lifecycle: systeemnotificatie tonen
SiteNotifications worden op database- en backendniveau in UTC gepland. Beheerlabels zoals actief, gepland, bijna verlopen en verlopen zijn afgeleide UI-statussen en geen zelfstandige databasewaarheid.
8.10 Lifecycle: featuretoggle of systeeminstelling wijzigen
Featuretoggles zijn bedoeld voor expliciet schakelbare functies. Verplichte kernfunctionaliteit hoort niet als toggle in deze tabel. SystemSettings is bedoeld voor bekende niet-booleaanse instellingen, waarbij per SettingKey in code bekend is welk waardeveld leidend is.
8.11 Systeemberichttemplates versus runtime systeemberichten
De scheiding tussen templates en verzonden berichten is belangrijk genoeg om apart te tekenen.
Een templatewijziging herschrijft bestaande verzonden systeemberichten niet. Nieuwe systeemcommunicatie kan de actuele template gebruiken, maar het mailboxitem zelf hoort bij het communicatiedomein.
8.12 Tabellen in dit domein
| Tabel | Categorie | Doel / verantwoordelijkheid |
|---|---|---|
PopupDetails | Configuratie - Systeem Popups | Bevat configureerbare popupdefinities die door beheerders via de GUI aangepast kunnen worden. Nieuwe popups worden uitsluitend via code en database-migraties toegevoegd. |
PopupDetailsHistory | Configuratie - Systeem Popups | Registreert wijzigingsmomenten op popupniveau, inclusief actor, tijdstip en type wijziging. |
PopupDetailsHistoryItems | Configuratie - Systeem Popups | Legt per historymoment vast welke velden van een popup gewijzigd zijn en wat de oude en nieuwe waarde was. |
SiteFeatureToggles | Configuratie | Sitebrede feature toggles die door beheerders via site-instellingen aan- of uitgezet kunnen worden. |
SystemSettings | Configuratie | Niet-booleaanse systeembrede instellingen die door beheerders via site-instellingen beheerd worden. |
ContentBlocks | Configuratie en contentbeheer | Uniform contentblokmodel voor frontpagecontent, vaste pagina-inhoud en tekstuele footerinhoud. |
ContentBlockHistory | Audit en historie | Veldniveau-history voor contentblokken. |
SiteLinks | Configuratie en contentbeheer | Herbruikbare URL-records voor footerlinks en andere beheerde linkverwijzingen. |
SiteLinkHistory | Audit en historie | Veldniveau-history voor URL-records. |
FooterSections | Configuratie en contentbeheer | Beheerbare secties binnen de footer per context en kolom. |
FooterLinkAssignments | Configuratie en contentbeheer | Koppelt SiteLinks aan een beheerbare footersectie en legt de volgorde vast. |
FooterLinkAssignmentHistory | Audit en historie | Veldniveau-history voor footerlinkplaatsingen en volgordewijzigingen. |
SystemMessageTemplates | Configuratie en contentbeheer | Codegedreven systeemberichtsjablonen waarvan inhoud en beperkte metadata via de GUI aangepast mogen worden. |
SystemMessageTemplateHistory | Audit en historie | Veldniveau-history van systeemberichtsjablonen. |
SiteNotifications | Configuratie en contentbeheer | Beheerder-gedreven, planbare en tijdelijke sitebrede of doelgroepgerichte notificaties. |
SiteNotificationHistory | Audit en historie | Veldniveau-history voor systeemnotificaties, inclusief inhoud, planning, doelgroep en weergaveregel. |
SiteFeatureToggleHistory | Audit en historie | Historische vastlegging van alle wijzigingen aan sitebrede featuretoggles. |
8.13 Relatie-inventaris binnen dit domein
| Brontabel | Veld | Verwijst naar | Nullable | Relatietype |
|---|---|---|---|---|
PopupDetails | UpdatedByUserId | Users.Id | J | Soft link |
PopupDetailsHistory | PopupDetailsId | PopupDetails.Id | N | Harde FK |
PopupDetailsHistory | ChangedByUserId | Users.Id | N | Soft link |
PopupDetailsHistoryItems | PopupDetailsHistoryId | PopupDetailsHistory.Id | N | Harde FK |
SiteFeatureToggles | UpdatedByUserId | Users.Id | J | Soft link |
SystemSettings | UpdatedByUserId | Users.Id | J | Soft link |
ContentBlocks | CreatedByUserId | Users.Id | N | Soft link |
ContentBlocks | UpdatedByUserId | Users.Id | J | Soft link |
ContentBlockHistory | ContentBlockId | ContentBlocks.Id | N | Harde FK |
ContentBlockHistory | ChangedByUserId | Users.Id | N | Soft link |
SiteLinks | CreatedByUserId | Users.Id | N | Soft link |
SiteLinks | UpdatedByUserId | Users.Id | J | Soft link |
SiteLinks | DeletedByUserId | Users.Id | J | Soft link |
SiteLinkHistory | SiteLinkId | SiteLinks.Id | N | Harde FK |
SiteLinkHistory | ChangedByUserId | Users.Id | N | Soft link |
FooterSections | CreatedByUserId | Users.Id | N | Soft link |
FooterSections | UpdatedByUserId | Users.Id | J | Soft link |
FooterSections | DeletedByUserId | Users.Id | J | Soft link |
FooterLinkAssignments | FooterSectionId | FooterSections.Id | N | Harde FK |
FooterLinkAssignments | SiteLinkId | SiteLinks.Id | N | Harde FK |
FooterLinkAssignments | CreatedByUserId | Users.Id | N | Soft link |
FooterLinkAssignments | UpdatedByUserId | Users.Id | J | Soft link |
FooterLinkAssignments | DeletedByUserId | Users.Id | J | Soft link |
FooterLinkAssignmentHistory | FooterLinkAssignmentId | FooterLinkAssignments.Id | N | Harde FK |
FooterLinkAssignmentHistory | ChangedByUserId | Users.Id | N | Soft link |
SystemMessageTemplates | UpdatedByUserId | Users.Id | J | Soft link |
SystemMessageTemplateHistory | SystemMessageTemplateId | SystemMessageTemplates.Id | N | Harde FK |
SystemMessageTemplateHistory | ChangedByUserId | Users.Id | N | Soft link |
SiteNotifications | CreatedByUserId | Users.Id | N | Soft link |
SiteNotifications | UpdatedByUserId | Users.Id | J | Soft link |
SiteNotificationHistory | SiteNotificationId | SiteNotifications.Id | N | Harde FK |
SiteNotificationHistory | ChangedByUserId | Users.Id | N | Soft link |
SiteFeatureToggleHistory | SiteFeatureToggleId | SiteFeatureToggles.Id | N | Harde FK |
SiteFeatureToggleHistory | ChangedByUserId | Users.Id | N | Soft link |
8.14 Bewuste niet-FK's en sleutelsets
In dit domein komen veel velden voor die als code-, enum- of sleutelwaarde functioneren, maar bewust geen harde FK zijn:
| Veldtype | Voorbeelden | Waarom geen harde FK? |
|---|---|---|
| Technische sleutels | PopupDetails.Key, FeatureKey, SettingKey, BlockKey, TemplateKey | De toegestane set wordt door code/migratie beheerst en moet niet vrij via relationele beheertabellen ontstaan. |
| Context- en domeintypen | DomainType, ContextType, AudienceType, FooterColumnType | Dit zijn gesloten functionele sleutelsets die rendering en doelgroep bepalen. |
| Weergave- en variantwaarden | PopupType, PopupVariant, ButtonTheme, NotificationType, DisplayRule, LinkType | De waarden sturen UI- en applicatiegedrag; een FK-tabel zou hier vooral extra beheercomplexiteit toevoegen. |
| Actie- of rendererreferenties | LeftButtonActionCallMethod, RightButtonActionCallMethod, CustomRendererKey | De daadwerkelijke actie of renderer bestaat in code en kan niet veilig als vrije databaseconfiguratie worden behandeld. |
De ERD-pagina tekent deze velden daarom niet als relaties. Zij horen wel expliciet in de database-informatie en in de SRS-validaties thuis.
8.15 Inzoomadvies
Voor review is deze volgorde het meest praktisch:
- Begin met
SiteFeatureTogglesenSystemSettingswanneer je wilt begrijpen welke functies of globale waarden het gedrag beïnvloeden. - Bekijk
ContentBlocks,SiteLinks,FooterSectionsenFooterLinkAssignmentswanneer het gaat om beheerbare pagina- of footerinhoud. - Gebruik
PopupDetailsenSystemMessageTemplatesvoor gebruikersfeedback en systeemcommunicatie-inhoud. - Gebruik
SiteNotificationswanneer het gaat om tijdelijke frontpage-overlays. - Controleer de bijbehorende historytabellen wanneer de vraag is wie iets gewijzigd heeft en welke waarde van/naar is gegaan.
8.16 Afgedichte keuzes en onderhoud
| Onderwerp | V1.0-keuze | Bron / vervolgcontrole |
|---|---|---|
SystemSettings-history | Geen eigen historytabel in de V1.0-baseline. UpdatedAtUtc en UpdatedByUserId zijn voldoende voor de actuele waarde; relevante beheerwijzigingen kunnen via beheerlogging/technische logging worden herleid. | Heropenen wanneer juridische audit, beheerhistorie of supportanalyse een volledige oude/nieuwe waardehistorie vereist. |
SettingKey naar Value* | De initiële sleutelcatalogus staat in configuratie en contentbeheer. Per key is één waardeveld leidend. | Nieuwe keys ontstaan via code en migratie. |
| Popup-, template- en notificatieplaceholders | Stabiele keys en placeholders zijn seeddata-/codegedreven. Beheer wijzigt inhoud, niet de technische sleutelset. | Nieuwe placeholders vereisen code-/migratie-impactcontrole. |
| URL-validatie | Opslaan wordt synchroon geblokkeerd wanneer de interne route of externe URL ongeldig is. Er komt geen aparte validatiestatus in de V1.0-baseline. | Alleen heroverwegen wanneer externe URL-controle asynchroon of periodiek gemaakt wordt. |
| Overkoepelende historypresentatie | Dit is afgedicht via audit, historie en technische uitgangspunten. | Nieuwe historytabellen volgen hetzelfde patroon. |
Deze punten zijn daarmee geen open ERD-blokkers meer. Zij blijven normale onderhoudscontroles wanneer configuratie-, content- of seeddata-eisen wijzigen.