TypeORM - Mối quan hệ

Mối quan hệ được sử dụng để chỉ mối quan hệ giữa bảng trong cơ sở dữ liệu. Nói chung, mối quan hệ tồn tại giữa hai bảng khi một trong số chúng có khóa ngoại tham chiếu đến khóa chính của bảng kia. Tính năng này làm cho cơ sở dữ liệu quan hệ mạnh mẽ hơn và lưu trữ thông tin hiệu quả hơn.

TypeORM cho phép các thực thể có liên quan với nhau và sau đó là các bảng cơ sở dữ liệu. Nói chung, mối quan hệ có thể được phân thành bốn loại rộng hơn. Chúng như sau,

one-to-one- Một đối tượng của thực thể đã cho chỉ liên quan đến một đối tượng của thực thể đích và ngược lại. Ví dụ, một quốc gia sẽ chỉ có một thủ đô và tương tự, một thành phố sẽ chỉ là thủ đô của một quốc gia.

many-to-one- Nhiều đối tượng của thực thể đã cho liên quan đến một đối tượng của thực thể đích. Ví dụ: thành phố chỉ thuộc một quốc gia nhưng quốc gia có thể có nhiều thành phố.

one-to-many - Tương tự như nhiều-một ngoại trừ mối quan hệ bị đảo ngược.

many-to-many- Nhiều đối tượng của thực thể đã cho liên quan đến nhiều đối tượng của thực thể đích. Ví dụ: một bài viết có thể được gắn thẻ theo nhiều chủ đề như ngôn ngữ lập trình, tài chính, v.v., và đồng thời một thẻ cụ thể cũng có thể có nhiều bài viết.

TypeORM cũng cung cấp các tùy chọn để nâng cao mối quan hệ của các thực thể. Chúng như sau:

  • eager - Đối tượng thực thể nguồn cũng tải các đối tượng thực thể đích.
  • cascade - Đối tượng thực thể đích được chèn hoặc cập nhật trong khi đối tượng thực thể nguồn được chèn hoặc cập nhật.
  • onDelete - Các đối tượng thực thể đích cũng bị xóa trong khi đối tượng thực thể nguồn bị xóa.
  • primary - Dùng để chỉ định cột quan hệ có phải là khóa chính hay không.
  • nullable - Được sử dụng để chỉ định rằng cột quan hệ có giá trị rỗng hoặc không.

Hãy để chúng tôi đi qua các loại ánh xạ quan hệ khác nhau một cách chi tiết.

Một-một

Như chúng ta đã học trước đó, nó được gọi là trường hợp của một trường bảng chứa trường hợp của trường bảng khác và ngược lại. Hãy để chúng tôi tạo ra mộtDetails bàn -

Thông tin chi tiết.

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity() 
export class Details {
   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   gender: string; 
   
   @Column() 
   country: string; 
}

Hãy tạo một thực thể khác là Khách hàng như sau:

Khách hàng.ts

import {Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn} from "typeorm"; 

import {Details} from "./Details"; 

@Entity() 
export class Customer { 

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   name: string; 
   
   @OneToOne(type => Details) @JoinColumn() 
   details: Details;
}

Đây,

Chúng tôi đã thêm ánh xạ OneToOne đến Details bàn. @JoinColumn() chứa "id quan hệ" và khóa ngoại để Customerbàn. Chúng ta có thể lưu mối quan hệ trongindex.ts như sau -

const details = new Details(); details.gender = "female"; details.country = "india" await connection.manager.save(details);

const customer = new Customer(); customer.name = 'customer1'; customer.details = Details; await connection.manager.save(Customer);

Một-nhiều và Nhiều-một

Như chúng ta đã học trước đó, nó được gọi là trường thể hiện của trường bảng đầu tiên chứa nhiều trường hợp của trường bảng thứ hai được gọi là One-to-Many ánh xạ và nhiều phiên bản của bảng đầu tiên chỉ chứa một phiên bản của bảng thứ hai được gọi là Many-to-One lập bản đồ.

Hãy xem xét một ví dụ về Studentproject trong khi đó, sinh viên có thể làm việc trên nhiều dự án nhưng mỗi dự án chỉ được xử lý bởi một sinh viên.

Hãy tạo một Project thực thể như sau -

Dự án

import {Entity, PrimaryGeneratedColumn, Column, ManyToOne} from "typeorm"; import {Student} from "./Student"; 
@Entity() 
export class Project {  

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   projects: string; 
   
   @ManyToOne(type => Student, student => student.projects) student: Student; 
}

Bây giờ, chúng tôi tạo Student thực thể như bên dưới -

import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm"; import {Project} from "./Project"; 

@Entity() 
export class User {  
   
   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   name: string; 
   
   @OneToMany(type => Project, project => project.student) projects: Project[];  
}

Đây,

@OneToMany bản đồ tài sản Project@ManyToOne tài sản được ánh xạ tới Student. Tuy nhiên,@OneToMany không thể tồn tại mà không có @ManyToOne@ManyToOne thuộc tính chứa "id quan hệ" và khóa ngoại.

Chúng tôi có thể lưu kết nối trong index.ts như sau -

const proj1 = new Project(); proj1.projects = "database management"; await connection.manager.save(proj1); 

const proj2 = new Project(); proj2.projects = "web application"; await connection.manager.save(proj2); 

const stud = new Student(); stud.name = "Student1"; stud.projects = [proj1, proj2]; await connection.manager.save(stud);

Nhiều nhiều

Như chúng ta đã học trước đó, nó được tham chiếu bởi nhiều bản ghi trong một bảng có liên quan đến nhiều bản ghi trong bảng khác. Hãy xem xét một ví dụ, sinh viên Đại học có thể đăng ký nhiều lớp cùng một lúc, nghĩa là sinh viên có thể có bốn hoặc năm lớp mỗi học kỳ và một lớp có thể có nhiều sinh viên.

Chúng ta có thể kết luận một cách đơn giản, một học sinh có nhiều lớp, và một lớp có nhiều học sinh. Hãy tạo một thực thể choClasses như sau -

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm"; 

@Entity() 
export class Classes { 

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   name: string; 
}

Bây giờ, chúng tôi tạo Student thực thể như bên dưới -

import {Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable} from "typeorm"; 
import {Classes} from "./Classes";

@Entity() 
export class Student { 

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   name: string;

   @Column() 
   subjects: string; 
   
   @ManyToMany(type => Classes) @JoinTable() 
   classes: Classes[];
}