Buscar..


Tabla por jerarquía

Este enfoque generará una tabla en la base de datos para representar toda la estructura de herencia.

Ejemplo:

public abstract class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime BirthDate { get; set; }
}

public class Employee : Person
{
    public DateTime AdmissionDate { get; set; }
    public string JobDescription { get; set; }
}

public class Customer : Person
{
    public DateTime LastPurchaseDate { get; set; }
    public int TotalVisits { get; set; }
}

// On DbContext
public DbSet<Person> People { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Customer> Customers { get; set; }

La tabla generada será:

Tabla: Campos de personas: Id. Nombre Fecha de nacimiento. Disimitador. Fecha de admisión. Fecha de trabajo. Descripción. Última compra. Fecha de visita. Total.

Donde 'Discriminador' guardará el nombre de la subclase en la herencia y 'AdmissionDate', 'JobDescription', 'LastPurchaseDate', 'TotalVisits' son anulables.

Ventajas

  • Mejor rendimiento ya que no se requieren combinaciones, aunque para muchas columnas la base de datos puede requerir muchas operaciones de paginación.
  • Fácil de usar y crear
  • Fácil de agregar más subclases y campos

Desventajas

Tabla por tipo

Este enfoque generará (n + 1) tablas en la base de datos para representar toda la estructura de herencia donde n es el número de subclases.

Cómo:

public abstract class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime BirthDate { get; set; }
}

[Table("Employees")]
public class Employee : Person
{
    public DateTime AdmissionDate { get; set; }
    public string JobDescription { get; set; }
}

[Table("Customers")]
public class Customer : Person
{
    public DateTime LastPurchaseDate { get; set; }
    public int TotalVisits { get; set; }
}

// On DbContext
public DbSet<Person> People { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Customer> Customers { get; set; }

La tabla generada será:

Tabla: Campos de personas: Id. Nombre Fecha de nacimiento

Tabla: Campos de empleados: PersonId AdmissionDate JobDescription

Tabla: Clientes: Campos: PersonId LastPurchaseDate TotalVisits

Donde 'PersonId' en todas las tablas será una clave principal y una restricción para People.Id

Ventajas

  • Tablas normalizadas
  • Fácil de agregar columnas y subclases
  • Columnas sin nulos

Desventajas

  • Se requiere unirse para recuperar los datos
  • La inferencia de subclases es más cara


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow