Sto attraversando una sorta di fase in cui analizzo in modo eccessivo e in secondo luogo indovina ogni singola decisione che prendo quando tento di scrivere software che mi impedisca di ottenere qualcosa.
Recentemente ho riscontrato la necessità di archiviare un oggetto C # "complesso" in un database SQLite. Per riassumere l'oggetto in un esempio minimo, diciamo solo che questo oggetto, di tipo Nodo, ha una lista di figli di tipo Foglia. Mentre si definiscono le lezioni, la maggior parte sarebbe d'accordo sul fatto che è buona norma tenere qualsiasi riferimento a Node su Leaf, questo permette a Leaf di essere indipendente, riutilizzabile e avere un "unico scopo".
public class Node
{
public string Name { get; set; }
public List<Leaf> Leaves { get; set;}
}
public class Leaf
{
public string Name { get; set; }
public int SomeValue { get; set; }
}
Ora, quando si scrivono le definizioni della tabella SQL, pre-fusione di plast1k farebbe qualcosa del genere (e presumo che anche il resto del mondo):
Nodes
-ID (int, identity)
-Name (varchar)
Leaves
-ID (int, identity)
-Name (varchar)
-SomeValue (int)
-NodeID (int, foreign key)
-Index (int)
Ma ora abbiamo creato una dipendenza tra Leaf e Nodes. Se guardi attentamente abbiamo anche creato una dipendenza tra Leaf e List < & gt ;. Più ci penso (fermati qui se questo è in effetti l'unico problema) più non mi piace.
Ho un'esperienza di progettazione di database pratica limitata. Il mio istinto è stato quello di iniziare a delineare la relazione, che in seguito ho imparato è chiamata bridge / linking table, e sembra essere una pratica standard quando la relazione è molti a molti.
Leaves
-ID (int, identity)
-Name (varchar)
-SomeValue (int)
LeavesMapping
-LeafID
-NodeID
-Index
All'inizio sembrava che andasse bene, ma ha iniziato a diventare difficile da gestire con i dati reali della mia vita. Ho anche deciso di ottimizzarlo per riordinare gli elementi dell'elenco e lo sto modellando nel database come un elenco collegato (usando NextLeaf piuttosto che un indice, per esempio).
Questo è davvero il modo giusto per farlo? Ci sono alternative? Quali costrutti mancano a modelli di dati relazionali che ci costringono a fare questo? Ci sono database che possono modellare questo allo stesso modo del codice?