La mia applicazione carica molti dati da un database in una struttura dati complessa. La in memoria struttura dati ressembles la struttura del database, il che significa che se il database contiene le seguenti tabelle:Dipendenze circolari in chiavi esterne: usarlo o evitarlo?
- tabella A, chiave è A1
- tabella B, chiave è B1, una delle colonne è una chiave esterna [la chiave] tabella a
- tabella C, chiave è C1, una delle colonne è una chiave esterna [la chiave] tabella B
Poi devo classi a, B e C, e:
- un membro di dati di B (B :: m_A) è un puntatore a una
- un membro di dati di C (C :: m_B) è un puntatore a B
Ciò implica che se carico il database, che devo caricarlo nell'ordine corretto. Se prima carico C, allora si lamenterà che non può impostare il valore C :: m_b perché l'istanza in cui dovrebbe puntare non è stata caricata.
problema è quando c'è anche una colonna in una che è una chiave esterna per uno degli altri tavoli, diciamo C.
ho potuto risolvere il problema caricando tutte le chiavi esterne come stringhe, e quindi eseguire una ricerca dopo che tutti i dati sono stati caricati, ma dato che a volte devo caricare milioni di record, non posso permettermi di spendere la memoria su queste (sebbene temporanee) stringhe.
Dopo aver letto del buon design (ad esempio il libro "Progettazione software C++ su larga scala") mi sembra che sia una cattiva idea avere riferimenti circolari. E.g. se il file X.H include Y.H, ma Y.H include anche X.H probabilmente hai un design errato; se la classe X dipende dalla classe Y e viceversa probabilmente hai un design errato, che dovrebbe essere risolto estraendo questa dipendenza e introducendo una terza classe Z, che dipende da X e Y (X e Y non dipenderanno più da nessuno) .
È consigliabile estendere questa regola di progettazione alla progettazione del database? In altre parole: prevenzione di riferimenti circolari in chiavi esterne.
Perché? Non fornisci alcuna giustificazione per la tua affermazione. – cdmckay