Schema DB reg
π― Cosa faβ
Definisce il persistence layer dell'anagrafica aziende e delle sue estensioni. Il dominio ha 15 tabelle totali, tutte documentate in questa pagina.
πΊοΈ Tabelle (15)β
Core anagrafica (4)β
| Tabella | Ruolo |
|---|---|
reg.companies | Anagrafica aziende (cliente / fornitore) |
reg.companyContacts | Canali di contatto (email, phone, pec) |
reg.companyLocations | Sedi del cliente con label descrittiva e locationTag di classificazione |
reg.headquarters | Sedi TrainingHub / ente formatore (indipendente dai clienti) |
Classificazione (3)β
| Tabella | Ruolo |
|---|---|
reg.companySubcategories | Sottocategorie custom di raggruppamento (FK da companies.companySubcategoryId) |
reg.companyTags | N:N azienda β tag di sistema |
reg.companiesPreferences | Preferenze booleane per azienda (record presente = preferenza attiva) |
Ruoli esterni (4)β
| Tabella | Ruolo |
|---|---|
reg.externalRspps | Anagrafica RSPP esterni (name, email, phone, notes) |
reg.companiesExternalRspps | Incarichi azienda β RSPP con startDate / endDate |
reg.territorialReferents | Anagrafica RLS territoriali β Rappresentanti dei Lavoratori per la Sicurezza designati a livello territoriale (art. 48 D.Lgs. 81/08). Stessa struttura di externalRspps. |
reg.companiesTerritorialReferents | Incarichi azienda β RLS territoriale con startDate / endDate |
Anagrafiche lookup (4)β
| Tabella | Ruolo |
|---|---|
reg.organizers | Enti organizzatori (PK: slug) |
reg.ccnl | Contratti Collettivi (PK: id int) β FK da companies.ccnlId |
reg.legalNatures | Forme societarie (PK: code) β FK da companies.legalNatureCode |
reg.academicQualifications | Titoli di studio |
π Relazioniβ
Referenze esterne:
reg.companies.atecoCodeβjob.atecoCodes(code)reg.companies.riskLevelIdβjob.riskLevel(id)reg.companies.legalNatureCodeβreg.legalNatures(code)(fuori scope)reg.companies.ccnlIdβreg.ccnl(id)(fuori scope)reg.companies.companySubcategoryIdβreg.companySubcategories(id)(fuori scope)reg.companyContacts.contactTypeTagβoss.tags(slug)reg.companyLocations.locationTagβoss.tags(slug)
HEADQUARTERS Γ¨ standalone: nessuna FK in uscita o in entrata da altre
tabelle reg core.
ποΈ Dettaglio tabelleβ
reg.companiesβ
Anagrafica aziende clienti e fornitori.
- PK:
id(GUID) - FK principali:
atecoCode β job.atecoCodes(code)(codice ATECO)riskLevelId β job.riskLevel(id)(livello di rischio)legalNatureCode β reg.legalNatures(code)(forma societaria, nullable)ccnlId β reg.ccnl(id)(nullable)companySubcategoryId β reg.companySubcategories(id)(nullable)
- Indice filtered:
IX_companies_active WHERE active = 1 INCLUDE (id, ccnlId, riskLevelId, companyName)β ottimizza le query su aziende attive - Flag:
isSupplier,isCustomer,active,viesValidated,riskLevelOverride,allowDirectCommunication,imported - Campi indirizzo: strutturati +
formattedAddress+ coordinate GPS - Legacy:
imported,originalNameβ marcati "da rimuovere una volta completate le importazioni iniziali"
reg.companyContactsβ
Canali di contatto (email, telefono, PEC) di un'azienda.
- PK:
id - FK:
companyId β reg.companies(id),contactTypeTag β oss.tags(slug) - Campi:
contactValue(testo libero),notes(libere) - Nota dominio: non modella persone, solo canali. Il nominativo della persona va eventualmente nelle note.
reg.companyLocationsβ
Sedi di un'azienda cliente: include sia le sedi operative sia i luoghi di lavoro (cantieri, postazioni, ecc.). Una sola tabella, classificazione via tag.
- PK:
id - FK:
companyId β reg.companies(id),locationTag β oss.tags(slug)(NOT NULL) - Campi:
label(NOT NULL, etichetta descrittiva, es. "Sede di Milano" o "Cantiere via Roma") + indirizzo strutturato +formattedAddress+ coordinate +notes - Tag iniziale:
location_operating("Sede operativa"). Altri tag possono essere introdotti inoss.tagsper classificare luoghi di lavoro specifici (es. cantieri).
reg.headquartersβ
Sedi del formatore TrainingHub.
- PK:
id - FK: nessuna in uscita (standalone)
- Campi:
label+ indirizzo strutturato + coordinate - Nota dominio: globale per tenant; non ha concetto di
proprietario. Se TrainingHub diventasse multi-tenant con piΓΉ enti
formatori la tabella andrebbe estesa con
organizerSlugo simile.
ποΈ Dettaglio tabelle estensioniβ
Classificazioneβ
reg.companySubcategoriesβ
Anagrafica delle sottocategorie custom.
- PK:
id - Campi:
label(obbligatorio) - FK in entrata:
reg.companies.companySubcategoryId β id
reg.companyTagsβ
N:N azienda β tag di sistema.
- PK:
id - FK:
companyId β reg.companies(id),tagSlug β oss.tags(slug) - Tag da
oss.tags: anagrafica centralizzata condivisa con contatti e locations.
reg.companiesPreferencesβ
Preferenze booleane.
- PK composita:
(companyId, preferenceTag) - FK:
companyId β reg.companies(id),preferenceTag β oss.tags(slug) - Nessun campo valore: presenza del record = preferenza attiva.
Ruoli esterniβ
reg.externalRspps / reg.territorialReferentsβ
Schema identico per le due anagrafiche:
- PK:
id - Campi:
name(obbligatorio),email,phone,notes
reg.companiesExternalRspps / reg.companiesTerritorialReferentsβ
Schema identico per le due tabelle di associazione (solo la FK cambia nome):
- PK:
id - FK:
companyId β reg.companies(id),externalRsppId β reg.externalRspps(id)(oterritorialReferentId β reg.territorialReferents(id)) - Campi:
startDate(obbligatoria),endDate(nullable = incarico in corso),notes - Nessun vincolo di unicitΓ o sovrapposizione: piΓΉ incarichi attivi per la stessa azienda contemporaneamente sono tecnicamente permessi.
Anagrafiche lookupβ
reg.organizersβ
- PK:
slug(stringa, URL-friendly) β referenziato da molti altri moduli - Modifiche allo slug rompono le FK esterne: non rinominare dopo che Γ¨ stato usato
reg.ccnlβ
- PK:
id(int identity) - Campi tipici:
code,label - FK in entrata:
reg.companies.ccnlId
reg.legalNaturesβ
- PK:
code(stringa) - Campi tipici:
label(descrizione estesa) - FK in entrata:
reg.companies.legalNatureCode
reg.academicQualificationsβ
- PK:
id - Campi tipici:
label - Usata principalmente nel dominio lavoratori (
job) per titoli di studio dei worker.
π File chiaveβ
TrainingHub.Database/reg/Tables/*.sqlβ 16 tabelleTrainingHub.Database/TrainingHub.Database.sqlprojβ progetto SQL- Indici espliciti: solo
IX_companies_activefiltered (vedi sopra)
β οΈ Debito tecnicoβ
-
imported/originalNamelegacy. Flag marcati come "da rimuovere". Pianificare rimozione dopo conclusione delle importazioni iniziali. -
headquarterssingleton implicito. Se multi-tenant futuro per enti formatori, aggiungere colonna proprietario. - Nessun check constraint su formati critici:
vatCode,fiscalCode,sdiCode,zipCode. La validazione Γ¨ demandata alla UI/service layer, che oggi non la fa rigorosamente. Possibile inserimento di dati inconsistenti via import o altri path. - FK verso tabelle fuori scope.
legalNatureCode,ccnlId,companySubcategoryIdtutti nullable: aziende create senza questi campi non sono bloccate. Valutare se in alcuni contesti (es. cliente per fatturazione) almenolegalNatureCodevada reso obbligatorio. -
companies.logocomeVARBINARY(MAX). Dimensioni potenzialmente grandi in riga β pesa su row size e query. Valutare spostamento su blob storage esterno o filestream. - Indici minimi su FK. Esiste
IX_companies_activefiltered, ma non ci sono indici espliciti sucompanyIddelle tabelle figlie (companyContacts,companyLocations). Valutare aggiunta per query "tutti i contatti/sedi di un'azienda".
π Vedi ancheβ
- Panoramica dominio
- Dominio
inv: schema DB per confronto con pattern e convenzioni - Guida utente: Panoramica aziende (docs-site-user)