Mi aplicación carga muchos datos de una base de datos en una estructura de datos compleja. La in-memory estructura de datos ressembles la estructura de la base de datos, lo que significa que si la base de datos contiene las siguientes tablas:Dependencias circulares en claves externas: úsala o evítala?
- cuadro A, clave es A1
- la tabla B, clave está B1, una de las columnas es una clave externa a [la tecla de] la tabla a
- tabla C, clave es C1, una de las columnas es una clave externa a [la tecla de] tabla B
entonces he clases a, B y C, y:
- un miembro de datos de B (B :: m_A) es un puntero a una
- un miembro de datos de C (C :: m_b) es un puntero a B
Esto implica que si me carga la base de datos, que tengo que cargarlo en el orden correcto. Si primero carga C, se quejará de que no puede establecer el valor C :: m_b porque no se cargó la instancia a la que debería apuntar.
problema es cuando también hay una columna en A que es una clave externa a una de las otras mesas, digamos C
que podía resolver el problema mediante la carga de todas las claves externas como cadenas, y luego realizar una búsqueda después de que se hayan cargado todos los datos, pero como a veces tengo que cargar millones de registros, no puedo permitirme gastar memoria en estas cadenas (aunque sean temporales).
Al haber leído sobre el buen diseño (por ejemplo, el libro "Diseño de software de C++ a gran escala"), me parece que es una mala idea tener referencias circulares. P. ej. si el archivo X. H incluye Y.H, pero Y.H también incluye X.H, es probable que tenga un mal diseño; si la clase X depende de la clase Y y viceversa, probablemente tenga un diseño incorrecto, que debería resolverse extrayendo esta dependencia e introduciendo una tercera clase Z, que depende de X e Y (X e Y ya no dependerán entre sí) .
¿Es una buena idea extender también esta regla de diseño al diseño de la base de datos? En otras palabras: evitar referencias circulares en claves externas.
¿Por qué? Usted no proporciona ninguna justificación para su afirmación. – cdmckay