fontcolor_theme
Deepkit ORM

継承

Deepkit ORM で継承を実装する方法はいくつかあります。

クラス継承

その一つはクラス継承を用いる方法で、extends を使ったシンプルなクラスを利用します。

import { PrimaryKey, AutoIncrement } from '@deepkit/type';

class BaseModel {
    id: number & PrimaryKey & AutoIncrement = 0;
    created: Date = new Date;
    updated: Date = new Date;
}

class User extends BaseModel {
    name: string = '';
}

class Customer extends BaseModel {
    name: string = '';
    address: string = '';
}

new Database(
    new SQLiteDatabaseAdapter('./example.sqlite'),
    [User, Customer]
);

BaseModel はエンティティとして使用されないため、データベースには登録されません。UserCustomer のみがエンティティとして登録され、BaseModel のすべてのプロパティを含めてテーブルにマッピングされます。

SQL テーブルは次のようになります:

CREATE TABLE user (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    created TEXT NOT NULL,
    updated TEXT NOT NULL,
    name TEXT NOT NULL
);

CREATE TABLE customer (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    created TEXT NOT NULL,
    updated TEXT NOT NULL,
    name TEXT NOT NULL,
    address TEXT NOT NULL
);

単一テーブル継承

単一テーブル継承は、複数のエンティティを1つのテーブルに格納する方法です。各モデルごとに別々のテーブルを持つ代わりに、単一のテーブルを使用し、各レコードの種類を判別するために追加の列(しばしば type などと名付けられます)を利用します。これは、同じプロパティを共有するエンティティが多い場合に有用です。

import { PrimaryKey, AutoIncrement, entity } from '@deepkit/type';

@entity.collection('persons')
abstract class Person {
    id: number & PrimaryKey & AutoIncrement = 0;
    firstName?: string;
    lastName?: string;
    abstract type: string;
}

@entity.singleTableInheritance()
class Employee extends Person {
    email?: string;

    type: 'employee' = 'employee';
}

@entity.singleTableInheritance()
class Freelancer extends Person {
    @t budget: number = 10_000;

    type: 'freelancer' = 'freelancer';
}

new Database(
    new SQLiteDatabaseAdapter('./example.sqlite'), 
    [Employee, Freelancer]
);

Person クラスはエンティティではないため、データベースには登録されません。EmployeeFreelancer クラスはエンティティであり、persons という名前の単一のテーブルにマッピングされます。type 列は各レコードの種類を判定するために使用されます。

SQL テーブルは次のようになります:

CREATE TABLE persons (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    firstName TEXT,
    lastName TEXT,
    type TEXT NOT NULL,
    email TEXT,
    budget INTEGER
);

ご覧のとおり、budget は任意項目になっています(Freelance クラスでは必須であるにもかかわらず)。これは、同じテーブルに Employee(budget の値を持たない)を挿入できるようにするためです。これは単一テーブル継承の制約です。

English中文 (Chinese)한국어 (Korean)日本語 (Japanese)Deutsch (German)