Domeinmodel

De eerste stap ((#todo: van wat?)) is het aanmaken van een domeinmodel. Dit is het model van de entiteiten en hun relaties. Een entiteit is in datavault termen een hub met een of meerdere sats; een relatie is een link. Een link is altijd tussen twee entiteiten, oftewel tussen twee hubs. Door het model (de python module) te registreren bij de pipe en de pipeline te runnen zullen de tabellen in de database worden aangemaakt (zie onderaan).

Definiëren Entiteiten

#todo: ik neem aan dat de todo’s uit onderstaand voorbeeld voor de definitieve versie weg moeten. Het definiëren van een entiteit gaat als volgt:

class Medewerker(DvEntity):
    class Default(Sat):
        geboortedatum = Columns.DateColumn()
        geslacht_code = Columns.TextColumn()
        overlijdens_indicator = Columns.TextColumn()
        datum_overlijden = Columns.DateTimeColumn()

    class Naamsgegevens(Sat):
        inschrijfnummer = Columns.TextColumn()
        initialen = Columns.TextColumn()
        voornamen = Columns.TextColumn()
        roepnaam = Columns.TextColumn()
        naamgebruik_code = Columns.TextColumn() #todo: ref kolom van maken? ;ik neem aan dat deze todo weg moet
        achternaam = Columns.TextColumn()
        geslachtsnaam_voorvoegsels = Columns.TextColumn()
        partnernaam = Columns.TextColumn()
        partnernaam_voorvoegsels = Columns.TextColumn()

    class Identificatie(Sat):
        nummer = Columns.TextColumn()
        geldig_tot = Columns.DateColumn()

    #todo: om te initialiseren zijn onderstaande regels nodig, nog uitzoeken of dat anders kan
    default = Default()
    naamsgegevens = Naamsgegevens()
    indentificatie = Indentificatie()

De class Medewerker erft over van DvEntity en krijgt 3 inner classes als sats. In de database zullen dus 4 tabellen worden aangemaakt:

  • medewerker_hub
  • medewerker_sat (De Default inner class levert een sat op met een naam samengesteld uit de entiteit-naam met het achtervoegsel sat)
  • medewerker_sat_naamsgegevens
  • medewerker_sat_indentificatie

Je kunt overerven van de Medewerker class:

class Arts(Medewerker):
    class Artsgegevens(Sat):
        agbcode = Columns.TextColumn()
        specialisatie = Columns.TextColumn()

    artsgegevens = Artsgegevens()

De arst krijgt hierdoor ook de 3 hubs van de medewerker. Er zal geen arts_hub verschijnen in de database, want deze erft niet rechtstreeks over van DvEntity. De sat zal wel verschijnen. Er komen dus de volgende tabellen:

  • medewerker_hub
  • medewerker_sat
  • medewerker_sat_naamsgegevens
  • medewerker_sat_indentificatie
  • medewerker_sat_artsgegevens

HybridSats

Hybrid sats zijn sats die als sleutel een combinatie van 3 ipv 2 velden hebben. Dus naast de standaard id en runid (datum) velden hebben ze een 3de sleutelveld; namelijk het veld ‘type’. Je kunt dit bijvoorbeeld toepassen op telefoonnummers:

class Persoon(DvEntity):
    class Telefoonnummers(HybridSat):
        class Types:
            vast = 'vast'
            mobiel = 'mobiel'
            fax = 'fax'
        nummer = Columns.TextColumn()
        geldig_tot = Columns.DateColumn()

De class erft over van HybridSat. Hierdoor krijgt het al het extra veld ‘type’ De inner class Types is een handigheid (niet verplicht) en bevat alleen strings. Deze waardes worden in de database opgeslagen in het veld type. Om de standaard databaseview (query) aan te maken voor deze entititeit, met daarin voor elke telefoonnummer-type de twee kolommen ‘nummer’ en ‘geldig_tot’ is het wel nodig van te voren te definiëren welke types er kunnen zijn in de inner class Types.

Referenties

Een sat mag geen links (foreign keys) bevatten naar andere tabellen. Hierop bestaat 1 uitzondering: er mag een join zijn met de referentietabel. Standaard wordt een dv schema uitgerust met een referentie tabel. Dat is 1 tabel met daarin alle referentie velden.

De referentie tabel heeft de volgende stuctuur:

  • type (text, key)
  • code (text, key)
  • description (text)
  • description2 (text)

De sleutel is de combinatie van type met code. Bij deze combinatie kan vervolgens de omschrijving gevonden worden.

Je definieert in de Sat een RefColumn als volgt:

class RefTypes:
    # aanmaken van enkele gebundelde string constanten
    geslacht = 'geslacht'
    specialisme_codes = 'specialisme'

class Medewerker(DvEntity):
    class Default(Sat):
        geboortedatum = Columns.DateColumn()
        geslacht_code = Columns.RefColumn(RefTypes.geslacht)

Geslachtcode is hier een ref-column. Deze heeft dus een code-omschrijving combinatie in de referentie tabel en zal in de standaard view te zien zijn.

Wanneer de database wordt aangemaakt, worden behalve de tabellen ook views aangemaakt. Per entity 1 view. Bovenstaand voorbeeld zal een medewerker_view aanmaken met de velden:

  • bk
  • geboortedatum
  • geslacht_code
  • geslacht_desc

Ensemble_view

Een ensemble_view is een view van een verzameling etiteiten met de daarbij horende link(s). Voordat een ensemble_view gemaakt kan worden is het wel noodzakelijk dat de views van gebruikte entiteiten en van de links tussen die entiteiten al gemaakt zijn. De klasse van de gewenste ensemble_view maak je als volgt:

class TestEnsemble(Ensemble_view):
def __init__(self,name='',entity_and_link_list=[]):
    Ensemble_view.__init__(self, name='',entity_and_link_list=[])
    self.name = 'test_view'
    self.add_entity_or_link(Zorginstelling)
    self.add_entity_or_link(Zorgverlener, 'huisarts')
    self.add_entity_or_link(Zorgverlener, 'fysio')
    self.add_entity_or_link(Zorgverlener_Zorginstelling_Link, 'link')

Je dient dus een naam voor de ensemble op te geven in ‘self.name’. Verder moet moet aangeven worden welke entiteiten met daarbijhorende link(s) deze ensemble bevat. In plaats van alleen de entiteit naam (‘Zorginstelling’) kan aan de entititeiten of links ook een alias gegeven worden zoals bijvoorbeeld de veel kortere alias ‘link’ in plaats van ‘Zorgverlener_Zorginstelling_Link’.

Aanmaken tabellen

Door het domeinmodel (de python module) te registreren bij de pipe en vervolgens de pipeline te runnen zullen de tabellen in de database worden aangemaakt:

from domainmodels from main import get_root_path_domain

pipeline = Pipeline(config)
pipe = pipeline.get_or_create_pipe('test')
pipe.register_domain(main_domain)
pipeline.run()