Técnicas para la base de datos de la herencia?

¿Cuáles son los consejos y técnicas que cuando usted necesita persistir clases con herencia relacional de la base de datos que no admiten la herencia?

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 varios pregunta con respecto a la base de datos de la herencia, pero la mayoría eran sobre el cambio a un motor de base de datos que soporta de forma nativa. Pero digamos que yo estoy atascado con SQL Server 2005… ¿cuáles son mis opciones?

InformationsquelleAutor chakrit | 2008-12-22

3 Kommentare

  1. 27

    Tres estrategias comunes:

    1. Crear una tabla para cada clase de la jerarquía que contienen las propiedades definidas para cada clase y una clave externa en el nivel superior de la superclase de la tabla. Así, podría tener una vehicle tabla con otras tablas como car y airplane que tienen un vehicle_id columna. La desventaja aquí es que usted puede necesitar para realizar una gran cantidad de combinaciones sólo para obtener un tipo de clase a cabo.

    2. Crear una tabla para cada clase de la jerarquía que contiene todas las propiedades. Esto se puede obtener complicado ya que no es fácil mantener una ID común a través de todas las tablas a menos que usted está usando algo como una secuencia. Una consulta para un superclase tipo requeriría sindicatos en contra de todas las tablas en cuestión.

    3. Crear una tabla para toda la jerarquía de clases. Esto elimina las uniones y sindicatos, sino que requiere que todas las columnas de todas las propiedades de la clase en una tabla. Usted probablemente tendrá que dejar a la mayoría de las columnas que aceptan valores null ya que algunas columnas no se aplican a los registros de un tipo diferente. Por ejemplo, el vehicle tabla puede contener una columna llamada wingspan que corresponde a la Airplane tipo. Si usted hace esta columna NO NULA, entonces cualquier instancia de un Car se inserta en la tabla requerirá un valor para wingspan aunque un valor de NULL podría tener más sentido. Si usted sale de la columna que acepta valores null usted podría ser capaz de evitar este con las restricciones check, pero podría ponerse feo. (Tabla Única Herencia)

    • La complejidad de la consulta fue donde me preocupa. Puede requerir un poco de trucos en la DAL parte para obtener el derecho.
    • Para la complejidad de la consulta #3 que suena mejor. También, en algunos DBMS (como Postgres) puede hacer que no nullness para cada subtipo específico a través de una restricción check, aunque las columnas serían anulables.
    • No sé si esto es una opción, sino que no uso 1. y utilizar las vistas para acceder a los datos de esta manera, usted recibe sólo la une en un solo lugar?
  2. 6

    Ser cuidadoso con la base de datos de la herencia en ciertas situaciones – hemos implementado en nuestra aplicación para nuestra estrategia de auditoría y terminamos con un cuello de botella de rendimiento/pesadilla.

    El problema era que la tabla base se utilizó fue insertar sólo y rápidamente cambiante, así que lo que acabó con los interbloqueos todos sobre el lugar. Actualmente estamos planeando romper estos aparte en sus propios cuadros, porque el dolor de cabeza de tener las mismas columnas en 15 mesas diferentes en comparación con un rendimiento pesadilla es bien vale la pena. Esto se agrava por el hecho de que el entity framework no necesariamente de la manija de la herencia de manera eficiente (esto es un problema conocido por Microsoft).

    De todos modos, sólo pensé en compartir algunos conocimientos ya que hemos sido a través del escurridor sobre este tema.

    • Así que estaban haciendo #1 y se mueve (se han movido) a #2? (de acantilado.meyers soluciones)

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea