Den gode database
1. Formål og anvendelsesområde
Denne side beskriver obligatoriske principper for modellering og strukturering af databaser i STAR City.
Retningslinjerne gælder for:
Nye forretningsdomæner
Nye tabeller i eksisterende forretningsdomæner
Omlægning af eksisterende datamodeller
Formålet er at sikre:
Entydig identifikation af forretningsobjekter
Konsistent historik og revisionsspor
Klar adskillelse mellem tekniske og forretningsmæssige nøgler
Ensartet praksis på tværs af udviklingsteams
2. Overordnet datamodelleringsprincip
Gældende dokumentation for metadata og historik findes i:
https://starwiki.atlassian.net/wiki/spaces/CITY/pages/1654718588
https://starwiki.atlassian.net/wiki/spaces/FYS/pages/1561461816
Denne side beskriver de databaserelaterede principper, som skal anvendes i STAR City.
3. Fact- og Historik-tabeller
3.1 Grundprincip
Alle forretningsdata, der indgår i sagsbehandling, skal kunne rekonstrueres historisk.
Der arbejdes med to typer tabeller:
Fact-tabeller
Historik-tabeller (navngives:
<FactTabelNavn>History)
For hver Fact-tabel skal der oprettes en tilhørende Historik-tabel.
3.2 Fact-tabellen
Fact-tabellen indeholder:
Den aktuelle (gældende) version af entiteten
Den tekniske primærnøgle (int)
Forretningsmæssig identifikation (ExternalIdentifier)
Aktuel versionsidentifikation (ExternalVersionIdentifier)
Obligatoriske metadatafelter jf. Star.Foundation
Fact-tabellen indeholder altid den seneste gældende version.
Ved sletning fjernes rækken fra Fact-tabellen.
En Fact-tabel kan indeholde flere forekomster for samme borger (PersonId), fx flere kontaktgruppeforløb.
3.3 Historik-tabellen
Historik-tabellen indeholder:
Alle tidligere versioner
Indsættelser, opdateringer og sletninger
Samme datamodel som Fact-tabellen
Metadata inkl. operationstype
Hver ændring skal resultere i:
Opdatering af Fact-tabellen
Indsættelse af ny række i Historik-tabellen
Read-operationer logges ikke i revisionshistorikken, men i systemlog jf. gældende logningsprincipper.
Metadatafelter beskrives centralt i: https://starwiki.atlassian.net/wiki/spaces/CITY/pages/1654718588
4. ID-strategi (obligatorisk)
Dette er en normativ og gældende standard for STAR City.
4.1 Tekniske nøgler
Primærnøgler i databasen skal være interne integers
Fremmednøgler skal være interne integers
Interne nøgler må aldrig eksponeres via API’er
4.2 Forretningsmæssig identifikation
Hver forretningsentitet skal have:
ExternalIdentifier (GUID)
Er entitetens forretningsmæssige unikke nøgle
Er immutable
Er globalt unik
Eksponeres i API’er
Anvendes REST-mæssigt til at pege på en entydig entitet
ExternalIdentifier ændres aldrig i entitetens levetid.
ExternalVersionIdentifier (GUID)
Identificerer en konkret version af entiteten
Genereres ved enhver ændring
Opdateres ved:
Create
Update
Forretningsmæssig korrektion
Eksponeres efter behov (fx ved historiske opslag)
ExternalVersionIdentifier muliggør opslag på:
“Hvordan så entiteten ud på et givent tidspunkt?”
4.3 Sammenhæng mellem nøgler
Type | Anvendelse |
|---|---|
int PK | Teknisk relationel integritet |
ExternalIdentifier | Forretningsmæssig identifikation |
ExternalVersionIdentifier | Versionsidentifikation |
Denne adskillelse er obligatorisk og må ikke fraviges.
5. Persondata og identifikation af borgere
CPR-nummer må ikke anvendes som primær identifikation i databaser.
5.1 PersonId (obligatorisk)
PersonId er den eneste tilladte tekniske identifikation af en borger i databasen.
Brugen af PersonId er ikke valgfri.
Følgende gælder:
PersonId skal anvendes i alle tabeller, hvor der refereres til en borger.
PersonId skal anvendes som foreign key ved relation til borger.
CPR-nummer må ikke anvendes som nøgle eller reference i nye tabeller.
CPR må kun anvendes som oplysning, hvor det er forretningsmæssigt nødvendigt og reguleret.
Hvert forretningsdomæne har et PersonId, som entydigt peger på en borger inden for domænet.
PersonId:
Er stabilt inden for domænet
Er uafhængigt af CPR-nummer
Ændres ikke ved CPR-skift
Må ikke eksponeres ukontrolleret
5.2 Eksisterende tabeller
Eksisterende tabeller med CPR-nummer skal ved ændringer eller videreudvikling omlægges til PersonId.
Der må ikke oprettes nye løsninger, der baserer relationer på CPR-nummer.
6. Navngivning
6.1 Tabeller
Engelske navne
CamelCase
Placering i korrekt schema iht. byggeblok/domæne
Historiktabeller navngives:
<FactNavn>History
6.2 Kolonner
Følger domænemodellens attributter
Engelske navne
CamelCase
Metadatafelter følger Star.Foundation standard
7. Index-principper
7.1 Clustered index
Alle tabeller skal have et clustered index
Heaps må ikke anvendes, medmindre der foreligger særlig begrundelse
7.2 Foreign keys
Foreign keys skal som udgangspunkt have index
Undtagelse: reference til små kodelistetabeller
Vurdering skal baseres på:
Forventet datamængde
Query-mønstre
Performanceanalyse
7.3 Script til udtræk af foreign keys uden indexes og index kandidater
For at sikre korrekt og konsistent indeksering skal følgende anvendes:
Der skal foretages systematisk kontrol af foreign keys uden tilhørende index.
Der skal foretages analyse af potentielle indexkandidater baseret på SQL Servers indbyggede statistik.
Til dette formål skal det fælles STAR-script anvendes:
Scriptet identificerer:
Foreign keys uden tilhørende index
Potentielle indexkandidater baseret på brugeradfærd og query-omkostninger
Ved vurdering af foreslåede indexkandidater skal der særligt ses på:
AvgUserImpactAvgTotalUserCostIndexAdvantage
Det er ikke et krav, at alle foreslåede indexkandidater implementeres.
Der skal foretages en konkret arkitekturmæssig vurdering baseret på:
Datamængde
Query-mønstre
Samlet performancepåvirkning
Foreign keys til små kodelistetabeller skal som udgangspunkt ikke indekseres.
8. Mange-til-mange relationer
Relationstabeller skal:
Kun indeholde de to foreign keys
Have composite primary key bestående af disse
Ikke have egen surrogate key
Der må ikke genereres unødvendige entiteter i domænemodellen.
9. Dokumentation
Alle tabeller og kolonner skal dokumenteres via:
Extended Properties (MS_Description)
Databasemodellen skal versionsstyres på linje med applikationskode.
10. Query Store
SQL Server Query Store skal være aktiveret på alle databaser i STAR City.
Formål:
Overvågning af performance
Identifikation af regressionsproblemer
Analyse af eksekveringsplaner