Trang chủ Kiến Thức Công Nghệ Sequelize là gì? So sánh Sequelize và Prisma
Công Nghệ

Sequelize là gì? So sánh Sequelize và Prisma

Chia sẻ
Sequelize là gì? So sánh Sequelize và Prisma
Chia sẻ

Quá trình phát triển ứng dụng, việc tương tác với database là một phần quan trọng. Các ORM (Object-Relational Mapping) ra đời nhằm giúp các developer dễ dàng làm việc với cơ sở dữ liệu mà không cần phải viết nhiều câu lệnh SQL phức tạp.

Sequelize là một trong những thư viện ORM mạnh mẽ dành cho Nodejs, giúp kết nối và quản lý cơ sở dữ liệu cách hiệu quả. Trong bài viết này, cùng mình đi tìm hiểu chi tiết về Sequelize. Bên cạnh đó, mình cũng sẽ hướng dẫn các bạn cách cài đặt và sử dụng Sequelize với TypeScript trong dự án.

1. Sequelize là gì?

Sequelize là một ORM (Object Relational Mapping) dành cho Nodejs và TypeScript, giúp Developer tương tác với cơ sở dữ liệu SQL một cách dễ dàng thông qua các phương thức JavaScript mà không cần viết câu lệnh SQL thuần. Sequelize hỗ trợ các cơ sở dữ liệu phổ biến như: Oracle, PostgresSQL, MySQL, MariaDB, SQLite, và SQL Server.

Sequelize cung cấp các tính năng mạnh mẽ như quản lý transactions, hỗ trợ quan hệ giữa table, cơ chế lazy loading và eager loading, cũng như khả năng read replication.

Nhờ thế, sequelize giúp bạn dễ dàng thao tác với cơ sở dữ liệu thông qua JavaScript, giảm thiểu việc viết SQL thuần và tối ưu hóa hiệu suất cho ứng dụng.

2. Tại sao nên sử dụng Sequelize?

  • Sequelize cung cấp API giúp bạn có thể thực hiện các thao tác CRUD (Create, Read, Update, Delete) mà không cần phải viết lệnh SQL thuần.
  • Như mình đã đề cập trên định nghĩa, Sequelize tương thích với các cơ sở dữ liệu phổ biến như: MySQL, PostgreSQL, SQLite và SQL Server.
  • Sequelize có thể tích hợp tốt với TypeScript, giúp bạn tận dụng toàn bộ lợi ích của type system của TypeScript, như tự động gợi ý code và kiểm tra kiểu tĩnh.
  • Sequelize cho phép bạn dễ dàng định nghĩa các quan hệ giữa các bảng như: one-to-one, one-to-many, và many-to-many
  • Bạn có thể dễ dàng quản lý sự thay đổi của cấu trúc cơ sở dữ liệu thông qua hệ thống migrations mà Sequelize cung cấp.

Bên cạnh đó, Sequelize còn có nhiều tính năng nâng cao giúp tối ưu quá trình làm việc với cơ sở dữ liệu:

  • Sequelize hỗ trợ quản lý transactions hiệu quả, đảm bảo các thay đổi được thực hiện hoặc hoàn tác một cách nhất quán.
  • Bạn có thể lựa chọn cách load data tối ưu với các cơ chế lazy loading và eager loading để tăng hiệu suất khi làm việc với các quan hệ giữa bảng.
  • Sequelize cho phép bạn sử dụng hooks để can thiệp vào quá trình trước và sau khi thao tác dữ liệu, chẳng hạn như kiểm tra hợp lệ.

3. Nhược điểm của Sequelize?

  • Khi cần tối ưu hóa truy vấn cho những trường hợp đặc biệt hoặc truy vấn phức tạp, bạn có thể gặp khó khăn hơn so với việc viết câu lệnh SQL thuần.
  • Vì Sequelize là một ORM đầy đủ tính năng, nó có thể chiếm dụng nhiều bộ nhớ hơn so với việc trực tiếp làm việc với lệnh SQL.

4. So sánh giữa Sequelize và Prisma

Sequelize Prisma
Ngôn ngữ hỗ trợ JavaScript, TypeScript TypeScript, JavaScript
Cơ sở dữ liệu hỗ trợ MySQL, PostgreSQL, SQLite, SQL Server, MariaDB MySQL, PostgreSQL, SQLite, MongoDB
Hỗ trợ schema tự động Không có, cần tạo thủ công models cho từng bảng. Có hỗ trợ, tự động generate schema dựa trên cơ sở dữ liệu.
Kiến trúc và Thiết Kế ORM truyền thống, tập trung vào việc tạo các model OOP để tương tác với cơ sở dữ liệu. Data-centric, tập trung vào quản lý dữ liệu và schema-first, tự động generate code dựa trên schema.
Mức độ dễ sử dụng Dễ học, cú pháp gần gũi với SQL. Rất dễ sử dụng nhờ Prisma Client, nhưng yêu cầu hiểu biết về schema-first.
Quan hệ giữa các bảng One-to-One, One-to-Many, Many-to-Many One-to-One, One-to-Many, Many-to-Many
Query Sử dụng phương thức ORM, câu lệnh trực tiếp tương tự như SQL Sử dụng Prisma Client với cú pháp trực quan
Hiệu suất Tốt, nhưng phụ thuộc vào cấu trúc truy vấn và cơ sở dữ liệu Có tính năng tối ưu truy vấn
Tính năng bổ sung Lazy loading, Eager loading, Read replication Tự động generate code dựa trên schema, quản lý kiểu dữ liệu tốt hơn
Tính mở rộng và quản lý dự án lớn Khả năng mở rộng tốt, nhưng có thể phức tạp với các dự án lớn và nhiều truy vấn phức tạp. Rất phù hợp cho các dự án lớn, tối ưu truy vấn và quản lý schema tự động.

5. Hướng dẫn sử dụng Sequelize trong dự án TypeScript

Trước khi đi vào cài đặt, bạn cần có một dự án TypeScript cơ bản. Nếu bạn chưa biết cách cũng đừng quá lo lắng bạn có thể tham khảo tại đây.

Sau khi đã sẵn sàng, cùng mình cài đặt Sequelize vào dự án nhé.

B1: Cài đặt Sequelize và driver cho cơ sở dữ liệu bạn muốn sử dụng. Ví dụ như bạn muốn sử dụng MySQL, hãy cài đặt Sequelize và driver MySQL.

Bash

npm install sequelize mysql2

Bên cạnh đó, bạn cần cài đặt thêm type của sequelize để TypeScript hiểu nhé.

Bash

npm install typescript @types/sequelize --save-dev

B2: Cấu hình kết nối với cơ sở dữ liệu. Mình sẽ tạo một file database.ts để quản lý việc kết nối.

Typescript

import { Sequelize } from 'sequelize';

const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql', // hoặc 'postgres', 'sqlite', 'mssql' tuỳ theo cơ sở dữ liệu bạn sử dụng
});

export default sequelize;

B3: Định nghĩa model

Trong Sequelize, mỗi table trong databas được ánh xạ đến một module. Mình sẽ tạo User module để đại diện cho bảng users trong database:

Typescript

import { Model, DataTypes } from 'sequelize';
import sequelize from './database';

class User extends Model {
  public id!: number;
  public name!: string;
  public email!: string;
  public readonly createdAt!: Date;
  public readonly updatedAt!: Date;
}

User.init(
  {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      primaryKey: true,
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    email: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
    },
  },
  {
    sequelize,
    modelName: 'User',
    tableName: 'users',
  }
);

export default User;

B4: Sau khi định nghĩa module, bạn có thể dễ dàng thực hiện các thao tác CRUD với database. Mình sẽ ví dụ cách thêm người dùng mới vào bảng users nha

Typescript

import User from './user';

const createUser = async () => {
  const newUser = await User.create({
    name: 'John Doe',
    email: 'johndoe@example.com',
  });
  console.log(newUser);
};

createUser();

Hay là lấy danh sách tất cả người dùng, update và xoá user

Typescript

const getAllUsers = async () => {
  const users = await User.findAll();
  console.log(users);
};

const updateUser = async (id: number) => {
  const user = await User.findByPk(id);
  if (user) {
    user.name = 'Updated Name';
    await user.save();
  }
};

const deleteUser = async (id: number) => {
  const user = await User.findByPk(id);
  if (user) {
    await user.destroy();
  }
};

Bên cạnh đó, bạn cũng có thể định nghĩa quan hệ 1-nhiều (One-to-Many) giữa bảng User và bảng Post như thế này:

Typescript

import { Model, DataTypes } from 'sequelize';
import sequelize from './database';
import User from './user';

class Post extends Model {
  public id!: number;
  public title!: string;
  public content!: string;
  public userId!: number;
}

Post.init(
  {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      primaryKey: true,
    },
    title: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    content: {
      type: DataTypes.TEXT,
      allowNull: false,
    },
    userId: {
      type: DataTypes.INTEGER,
      allowNull: false,
    },
  },
  {
    sequelize,
    modelName: 'Post',
    tableName: 'posts',
  }
);

User.hasMany(Post, { foreignKey: 'userId' });
Post.belongsTo(User, { foreignKey: 'userId' });

export default Post;

6. Kết luận

Hy vọng qua bài viết này, bạn đã nắm được cách sử dụng Sequelize từ việc cài đặt đến cấu hình và thao tác với cơ sở dữ liệu trong dự án. Nếu bạn đang làm việc với cơ sở dữ liệu trong các dự án Nodejs, Sequelize chắc chắn là một công cụ đáng để bạn cân nhắc sử dụng.

Các bài viết liên quan:

  • TypeORM là gì? So sánh TypeORM với Sequelize và Prisma
  • Deno là gì? So sánh Deno 2, Bun và Nodejs
  • Bun là gì? Lựa chọn Javascript Runtime mới cho các Developer
  • Prisma là gì? Thư viện ORM cho Node.js và TypeScript
Bài viết cùng chuyên mục
Tối ưu ứng dụng với cấu trúc dữ liệu cơ bản và bitwise
Công Nghệ

Tối ưu ứng dụng với cấu trúc dữ liệu cơ bản và bitwise

Trong bài viết này, 200Lab sẽ chia sẻ những trường hợp dễ...

Công Nghệ

So sánh Flutter vs React Native: Framework nào đáng học năm 2021

Điểm chung của Flutter, React Native đều là Cross-platform Mobile, build native...

HTTP/2 là gì? So sánh HTTP/2 và HTTP/1
Công Nghệ

HTTP/2 là gì? So sánh HTTP/2 và HTTP/1

Từ khi Internet ra đời, sự phát triển về các giao thức...

Upload File từ Frontend đến Backend mà rất nhiều bạn vẫn đang làm sai!!
Công Nghệ

Upload File từ Frontend đến Backend mà rất nhiều bạn vẫn đang làm sai!!

1. Client encode file (base64) rồi gởi về backend 200Lab đã từng...

Công Nghệ

React Native – Hướng dẫn làm việc với Polyline và Animated-Polyline trên Map

Vẽ đường đi trên bản đồ là một nghiệp vụ vô cùng...

Công Nghệ

Hybrid App và Native App: Những khác biệt to lớn

Bất cứ khi nào một công ty quyết định làm ứng dụng...

Web/System Architecture 101 – Kiến trúc web/hệ thống cơ bản cho người mới
Công Nghệ

Web/System Architecture 101 – Kiến trúc web/hệ thống cơ bản cho người mới

Đây là một kiến trúc cơ bản mà bất kì một người...

Công Nghệ

Tư duy kiến trúc thông qua các trò chơi mà rất nhiều bạn không biết

Tư duy kiến trúc là gì? Tư duy kiến trúc có thể...