要不要为系列单独建一张表
需求是"文章可以属于一个系列,系列页列出它下面的文章"。第一反应是加个字段:
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,文章不跟着消失,只是不再属于任何系列。这个决定应该在建表前问清楚,我补了一次迁移。