跳转至内容
There is a version suitable for your browser's language settings. Would you like to go to the english language of the site?
主页文档

Table

H1

数据库表的设计决定了我们能够存储何种类型的数据到数据库中。假设我们拥有一个用户表,那么我们便可以记录下每一位注册用户的详细信息。例如:

idnameemailgendercreatedAtupdatedAt
1Amberamber@example.comfemale1970-01-01 00:00:001970-01-01 00:00:00
2Julyjuly@example.commale1970-01-01 00:00:001970-01-01 00:00:00
3Reynardreynard@example.commale1970-01-01 00:00:001970-01-01 00:00:00

在这个例子中,每一行代表一个用户,每一列则代表不同的数据字段。

通常情况下,我们会在每张表中包含以下字段:idcreatedAtupdatedAt。其中,id 用于唯一标识数据行,而 createdAtupdatedAt 则用于记录数据的创建时间和最后更新时间。

列的类型

我们可以为表中的每个字段指定不同的数据类型。数据库支持的数据类型比 JavaScript 丰富多样。其中,我们常用的 varchar 类型用于存储字符串数据。不同的数据库系统可能有不同的数据类型,详细信息可以在 MySQL 列类型PostgreSQL 列类型 中找到。

创建表的模式

表模式定义了表中包含哪些列以及这些列的数据类型。首先,我们将在 /src/databases 目录下创建数据库表模式。完成创建后,我们将在该目录下编写一个 user-table.ts 文件来存储用户数据。

/src/databases/user-table.ts
// 适用于 MySQL
import type typia from "typia";
import { relations, sql } from "drizzle-orm";
import { mysqlTable, int, varchar, datetime } from "drizzle-orm/mysql-core";
export const userTable = mysqlTable(
"user",
{
id: int("id", { unsigned: true, mode: "bigint" }).autoincrement().primaryKey(),
name: varchar("name", { length: 32 }),
email: varchar("email", { length: 320 }).unique(),
gender: varchar("gender", { length: 320 }).unique(),
createdAt: datetime("createdAt").notNull().default(sql`CURRENT_TIMESTAMP`),
updatedAt: datetime("updatedAt").notNull().default(sql`CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`),
},
(t) => ({})
);

若使用 PostgreSQL,可使用以下代码:

/src/databases/user-table.ts
// 适用于 PostgreSQL
import type typia from "typia";
import { relations, sql } from "drizzle-orm";
import { pgTable, serial, time, varchar } from "drizzle-orm/pg-core";
export const userTable = pgTable(
"user", // 表名
{
id: serial("id", { mode: "bigint" }).primaryKey(),
name: varchar("name", { length: 32 }),
avatar: varchar("avatar", { length: 255 }),
email: varchar("email", { length: 320 }).unique(),
gender: varchar("gender", { length: 320 }),
createdAt: time("createdAt").notNull(),
updatedAt: time("updatedAt").notNull(),
},
(t) => ({})
);

自增列

每张表都应包含一个名为 id 的自增列,每当插入新行时,系统会自动为该行生成一个 id

MySQL

int("id", { unsigned: true, mode: "bigint" }).autoincrement().primaryKey()

PostgreSQL

serial("id", { mode: "bigint" }).primaryKey()

创建时间

推荐每张表都包含一个名为 createdAt 的列,用于自动记录每行数据的创建时间。

MySQL

datetime("createdAt").notNull().default(sql`CURRENT_TIMESTAMP`)

PostgreSQL

time("updatedAt").notNull().defaultNow()

更新时间

每张表都推荐包含一个名为 updatedAt 的列,用于自动记录每行数据的最后更新时间。

MySQL

datetime("updatedAt").notNull().default(sql`CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`)

PostgreSQL

PostgreSQL 目前不支持自动设置更新时间,因此需要在代码中手动设置。

索引

索引能够显著提高查询性能,我们建议为所有可能被查询的字段添加索引。通常,我们会将索引命名为字段名后加 X

/src/databases/user-table.ts
export const userTable = mysqlTable(
"user", // 表名
{
id: int("id", { unsigned: true, mode: "bigint" }).autoincrement().primaryKey(),
name: varchar("name", { length: 32 }),
email: varchar("email", { length: 320 }).unique(),
gender: varchar("gender", { length: 320 }).unique(),
createdAt: datetime("createdAt").notNull().default(sql`CURRENT_TIMESTAMP`),
updatedAt: datetime("updatedAt").notNull().default(sql`CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`),
},
(t) => ({
nameX: index("nameX").on(t.name),
})
);