수색…


계층 당 테이블

이 방법은 모든 상속 구조를 나타 내기 위해 데이터베이스에 하나의 테이블을 생성합니다.

예:

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; }

생성 된 테이블은 다음과 같습니다.

표 : 사용자 필드 : Id 이름 생년월일 Discrimitator AdmissionDate JobDescription LastPurchaseDate TotalVisits

'Discriminator'가 상속에 대한 하위 클래스의 이름을 보유하고 'AdmissionDate', 'JobDescription', 'LastPurchaseDate', 'TotalVisits'는 null을 허용합니다.

장점

  • 데이터베이스가 많은 페이징 작업을 요구할 수 있지만 많은 열에 대해서는 조인이 필요하지 않으므로 성능이 향상됩니다.
  • 사용 및 작성이 간단합니다.
  • 하위 클래스 및 필드를 쉽게 추가 할 수 있습니다.

단점

유형별 표

이 접근법은 데이터베이스에서 (n + 1) 개의 테이블을 생성하여 모든 상속 구조를 나타냅니다. 여기서 n은 하위 클래스 수입니다.

어떻게:

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; }

생성 된 테이블은 다음과 같습니다.

표 : 사용자 필드 : ID 이름 생년월일

표 : 직원 필드 : PersonId AdmissionDate JobDescription

표 : 고객 : 필드 : PersonId LastPurchaseDate TotalVisits

모든 테이블의 'PersonId'는 People.Id에 대한 기본 키 및 제약 조건입니다.

장점

  • 정규화 된 테이블
  • 열과 하위 클래스를 쉽게 추가 할 수 있습니다.
  • Null 허용 열 없음

단점

  • 데이터를 검색하려면 조인이 필요합니다.
  • 하위 클래스 추론이 더 비쌉니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow