6

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.

Respuesta

3

La única vez que debe necesitar una referencia circular es cuando está creando una estructura jerárquica, como un árbol de organización.

Table Employees 
    EmployeeID <----------| 
    SupervisorEmployeeID ---| 
2

Sí, las dependencias cíclicas en las bases de datos son una buena excusa para repensar el diseño.

+0

¿Por qué? Usted no proporciona ninguna justificación para su afirmación. – cdmckay

4

Desde una perspectiva de modelado de datos no hay nada fundamentalmente "malo" con una dependencia circualr. No significa que el modelo esté equivocado.

Desafortunadamente, la mayoría de los DBMS de SQL no pueden implementar efectivamente tales restricciones porque no son compatibles con las actualizaciones de múltiples tablas. Por lo general, la única forma de evitar esto es suspender temporalmente una o más restricciones (por ejemplo, usando una clave externa "diferible" o características similares) o alterando el modelo para hacer que una parte de la restricción sea opcional (colocando una de las columnas de referencia en una nueva tabla). Sin embargo, esto es solo una solución para una desagradable limitación de SQL, no significa que haya hecho algo mal para empezar.

2

Tienes que modelar los datos que tienes.Si hay una relación circular en los datos (por ejemplo, cada fotografía pertenece a una carpeta, pero cada carpeta tiene una foto de portada), entonces es correcto modelar eso como una relación circular en la base de datos.

Solo tuve esta situación una vez cuando usé Oracle, así que no tuve la oportunidad de ver cómo implementar dicha relación en otras bases de datos. Pero para Oracle se puede leer mi artículo aquí:

http://www.databasesandlife.com/circular-dependencies-on-foreign-key-constraints-oracle/