将 MongoDB 中的 ObjectId 与 mysql 结合使用

Use ObjectId from MongoDB with mysql

他们是否有可能将 mongoDB ObjectID 系统与 MySql 和 typeORM 一起使用,而不是使用增量 ID?

目标是像这样定义我的实体:

@Entity()
export class RolePermission implements IRolePermission {
    @ObjectIdColumn() id?: ObjectID;

    @Column()
    @IsNotEmpty()
    roleId: ObjectID;

    @Column()
    @IsNotEmpty()
    permissionId: ObjectID;
}

因此,我的实体可以拥有一个 ID,甚至无需持久化。 ObjectId 系统将防止我想用于此列的唯一约束发生冲突。

如果可以实施这样的系统,它们的性能是否有缺点?我记得用 PHP 实现了这样一个系统,当时,我读到了这个让我觉得没问题的回复:Is there a REAL performance difference between INT and VARCHAR primary keys?

其实很简单。您只需使用 mongodb 包中的 ObjectID 对象并像往常一样声明您的实体。

首先,安装mongodb依赖项:

yarn add mongodb
yarn add @types/mongodb

然后,声明您的实体。这里有一个用户和文章之间的工作关系的例子:

user.entity.ts:

import { Entity, Column, ManyToOne, PrimaryColumn } from 'typeorm';
import { Article } from './article.entity';
import { ObjectID } from 'mongodb';

@Entity()
export class User {
    constructor() {
        this.id = (new ObjectID()).toString();
    }

    @PrimaryColumn()
    id: string;

    @Column({ length: 500 })
    username: string = null;

    @OneToMany(type => Article, article => article.user)
    articles: Article[];
}

article.entity.ts:

import { Entity, Column, ManyToOne, PrimaryColumn } from 'typeorm';
import { User } from './user.entity';
import { ObjectID } from 'mongodb';

@Entity()
export class Article {

    constructor() {
        this.id = (new ObjectID()).toString();
    }

    @PrimaryColumn()
    id: string;

    @Column({ length: 500 })
    title: string = null;

    @ManyToOne(type => User, user => user.articles, {nullable: true})
    user: User;
}

并像往常一样使用它:

const user = new User();
user.username = 'email@adress.com';

const article = new Article();
article.title = 'Mon titre';
article.user = user;

await this.userRepository.save(user);
await this.articleRepository.save(article);