fontcolor_theme
Deepkit ORM

Vererbung

Es gibt mehrere Möglichkeiten, Vererbung in Deepkit ORM zu implementieren.

Klassenvererbung

Eine Möglichkeit ist die Verwendung von Klassenvererbung, die einfache Klassen mit extends verwendet.

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]
);

Da BaseModel nicht als Entity verwendet wird, wird es nicht in der Datenbank registriert. Nur User und Customer werden als Entities registriert und einer Tabelle zugeordnet, die alle Properties von BaseModel enthält.

Die SQL-Tabellen würden so aussehen:

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

Single Table Inheritance

Single Table Inheritance ist eine Möglichkeit, mehrere Entities in einer Tabelle zu speichern. Anstatt separate Tabellen für jedes Model zu haben, wird eine einzelne Tabelle verwendet, und eine zusätzliche Spalte (oft type oder ähnlich genannt) wird genutzt, um den Typ jedes Datensatzes zu bestimmen. Das ist nützlich, wenn Sie viele Entities haben, die dieselben Properties teilen.

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]
);

Die Klasse Person ist keine Entity und wird daher nicht in der Datenbank registriert. Die Klassen Employee und Freelancer sind Entities und werden auf eine einzelne Tabelle mit dem Namen persons abgebildet. Die Spalte type wird verwendet, um den Typ jedes Datensatzes zu bestimmen.

Eine SQL-Tabelle würde so aussehen:

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

Wie Sie sehen, wird budget optional gemacht (obwohl es in der Klasse Freelance erforderlich ist). Das dient dazu, das Einfügen von Employee (das keinen budget-Wert hat) in dieselbe Tabelle zu unterstützen. Das ist eine Einschränkung von Single Table Inheritance.

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