2008-12-22 20 views
31

¿Cuáles son los consejos/técnicas cuando necesita persistir las clases con herencia a la base de datos relacional que no admite la herencia?Técnicas para la herencia de la base de datos?

Decir que tengo este ejemplo clásico:

Person -> Employee -> Manager 
        -> Team lead 
        -> Developer 
     -> Customer -> PrivilegedCustomer 
        -> EnterpriseCustomer 

¿Cuáles son las técnicas disponibles para el diseño de la base de datos? Pros y contras de cada uno?

p.s. He buscado y encontrado varias preguntas sobre la herencia de la base de datos, pero la mayoría se trata de cambiar a un motor de base de datos que lo soporte de forma nativa. Pero digamos que estoy atrapado con SQL Server 2005 ... ¿cuáles son mis opciones?

+0

Pregunta relacionada: http://stackoverflow.com/questions/190296/how-do-you-effectively-model-inheritance-in-a-database –

Respuesta

27

Tres estrategias comunes:

  1. crear una tabla para cada clase en la jerarquía que contiene las propiedades definidas para cada clase y una clave externa de nuevo a la mesa superclase de nivel superior. Por lo tanto, es posible que tenga una tabla vehicle con otras tablas como car y airplane que tienen una columna vehicle_id. La desventaja aquí es que puede necesitar realizar muchas combinaciones solo para obtener un tipo de clase.

  2. Cree una tabla para cada clase en la jerarquía que contiene todas las propiedades. Esto puede ser complicado ya que no es fácil mantener una ID común en todas las tablas a menos que esté utilizando algo así como una secuencia. Una consulta para un tipo de superclase requeriría uniones contra todas las tablas en cuestión.

  3. Crea una tabla para toda la jerarquía de clases. Esto elimina uniones y uniones pero requiere que todas las columnas para todas las propiedades de clase estén en una tabla. Probablemente deba dejar la mayoría de las columnas nulables, ya que algunas columnas no se aplicarán a los registros de un tipo diferente. Por ejemplo, la tabla vehicle puede contener una columna llamada wingspan que corresponde al tipo Airplane. Si hace que esta columna NO sea NULA, cualquier instancia de Car insertada en la tabla requerirá un valor para wingspan aunque un valor de NULL tenga más sentido. Si deja la columna nulo, es posible que pueda evitar esto con restricciones de verificación, pero podría ponerse feo. (Single Table Inheritance)

+0

La complejidad de la consulta era en lo que a mí respecta. Puede requerir un poco de trucos en la parte DAL para hacerlo bien. – chakrit

+2

Para la complejidad de la consulta, el # 3 suena mejor. Además, en algunos DBMS (como Postgres) puede exigir la no anulación para cada subtipo específico a través de una restricción de verificación, aunque todas las columnas sean nulables. –

+1

No sé si esta es una opción pero no usa 1. y usa vistas para acceder a los datos de esta manera solo obtiene las uniones en un solo lugar. – Peter

6

Tenga cuidado con la herencia de la base de datos en determinadas situaciones: la implementamos en nuestra aplicación para nuestra estrategia de auditoría y terminamos con un cuello de botella de rendimiento/pesadilla.

El problema fue que la tabla base que usamos era solo de inserción y cambiaba rápidamente, así que con lo que terminamos fueron los interbloqueos todos sobre el lugar. Actualmente estamos planeando dividirlos en sus propias tablas porque el dolor de cabeza de tener las mismas columnas en 15 tablas diferentes en comparación con una pesadilla de rendimiento bien vale la pena. Esto también se vio agravado por el hecho de que el marco de la entidad no maneja necesariamente la herencia de manera eficiente (este es un problema conocido de Microsoft).

De todos modos, solo pensé en compartir algunos conocimientos ya que hemos pasado por el escurridor sobre este tema.

+0

Entonces, ¿estaba haciendo # 1 y se está moviendo (se movió) a # 2? (de las soluciones cliff.meyers) –

Cuestiones relacionadas