Recherche…


Tableau par hiérarchie

Cette approche va générer une table sur la base de données pour représenter toute la structure d'héritage.

Exemple:

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 table générée sera:

Tableau: Champs de personnes: Nom de l'identifiant BirthDate Discrimitator AdmissionDate JobDescription LastPurchaseDate TotalVisits

Où 'Discriminator' contiendra le nom de la sous-classe sur l'héritage et 'AdmissionDate', 'JobDescription', 'LastPurchaseDate', 'TotalVisits' sont nullables.

Avantages

  • De meilleures performances, car aucune jointure n'est requise, mais pour de nombreuses colonnes, la base de données peut nécessiter de nombreuses opérations de pagination.
  • Simple à utiliser et à créer
  • Facile d'ajouter plus de sous-classes et de champs

Désavantages

Tableau par type

Cette approche génère des tables (n + 1) sur la base de données pour représenter toute la structure d'héritage où n est le nombre de sous-classes.

Comment:

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 table générée sera:

Tableau: Champs de personnes: Nom de l'identifiant Date de naissance

Tableau: Champs Employees: PersonId AdmissionDate JobDescription

Table: Customers: Champs: PersonId LastPurchaseDate TotalVisits

Où 'PersonId' sur toutes les tables sera une clé primaire et une contrainte pour People.Id

Avantages

  • Tables normalisées
  • Facile à ajouter des colonnes et des sous-classes
  • Aucune colonne nullable

Désavantages

  • Join est nécessaire pour récupérer les données
  • L'inférence de sous-classe est plus chère


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow