Ciao Giuseppe,
ho diviso e creato delle tabelle relazionate alla anagrafica componenti del tipo : pompe, caldaie ecc... con le loro proprietà e in questo modo ho nortmalizzato il db, spero di non aver sbagliato.
Sì, è un modo valido che si chiama
Table per type per evitare di creare un tabellone con tutte le possibili proprietà al suo interno.
Il problema è se dovessi creare un componente ex novo come si fa a creare delle proprietà per quel oomponente senza aggiungere delle tabelle al db?
Usando questo approccio non puoi. E' sempre necessario creare una nuova tabella.
Se non vuoi creare tabelle e vuoi continuare ad usare un database relazionale puoi usare altri approcci:
- Crei una tabella che contiene le colonne comuni a tutti i tipi. Crei una seconda tabella in cui inserire le informazioni particolari. Questa tabella conterrà solo 3 colonne: IdPadre, NomeProprietà, ValoreProprietà. Il difetto è che sei costretto ad avere valori dello stesso tipo (nvarchar) e dovrai fare pivot per riottenere tutti i nomi proprietà come se fossero stati creati come vere colonne.
- Oppure, crei una sola tabella in cui metti una colonna XML che conterrà tutti i valori specifici come fosse un documento XML.
Entrambe le soluzioni ti consentiranno di interrogare i valori specifici ma probabilmente dovrai rinunciare, almeno in parte, ad usare query LINQ (se avevi intenzione di usare EF, per esempio).
In alternativa, sì, puoi scegliere di usare un database documentale come MongoDB che ti permette di usare query LINQ.
https://mongodb-documentation.readthedocs.io/en/latest/ecosystem/tutorial/use-linq-queries-with-csharp-driver.htmlL'unico modo per sapere se MongoDB è idoneo al tuo scenario è provarlo tu stesso. Considerala come attività di ricerca & sviluppo che potrebbe risolverti dei problemi poi.
Idealmente, dovresti inserire in MongoDB dei documenti autocontenuti, cioè che non hanno bisogno di alcuna JOIN.
Puoi anche scegliere di adottare una soluzione ibrida: tieni il database relazionale normalizzato e poi, ad intervalli periodici o in seguito al verificarsi di alcuni eventi, denormalizzi il contenuto creandoti dei documenti per MongoDB che diventerà il tuo "read model". In sostanza: scrivi da una parte e leggi dall'altra.
La complessità introdotta con lo scenario ibrido, secondo me, è giustificabile nel momento in cui alla tua applicazione accedono molti utenti contemporanei o quando hai una mole di dati tale che fare JOIN nel database relazionale inizia a rappresentare un vero problema per le prestazioni.
ciao,
Moreno
Modificato da BrightSoul il 11 marzo 2017 12.47 -