要不要为系列单独建一张表

MySQL 与 Prisma

需求是"文章可以属于一个系列,系列页列出它下面的文章"。第一反应是加个字段:

model Article {
  series String?
}

一个字符串,最省事。我用了两个月,然后遇到三件事,才决定建表。

一,系列名会打错。"TypeScript 补课"和"TypeScript补 课"是两个系列,列表里出现重复项,合并要写脚本。
二,系列页要展示描述、排序、封面。这些没地方放。字段加到文章上会变成"每篇文章重复存一遍系列描述",改一次要更新所有行。
三,要统计每个系列多少篇。字符串分组能算,但一旦系列本身有属性(比如是否显示),字符串就不够了。

判断标准我总结成一句:这个值除了"标识归属"之外,还有没有自己的属性和生命周期。有,就是实体,建表;没有,就是字段。

model Series {
  id       Int       @id @default(autoincrement())
  slug     String    @unique
  title    String
  order    Int       @default(0)
  articles Article[]
}

一篇文章一个系列,所以外键放在 Article 上(一对多)。要是将来一篇文章能进多个系列,那才需要中间表。我没提前建中间表——按现在的样子,改的时候多一次迁移,比现在多维护一张空表便宜。

删系列时文章怎么办,是我建表之后才想到的问题。onDelete 我选了 SetNull,文章不跟着消失,只是不再属于任何系列。这个决定应该在建表前问清楚,我补了一次迁移。

相关阅读