成为全栈·产品篇·领域建模:一个文章系统有哪些实体、什么关系

发布时间:2026/8/29 0:29:41

成为全栈·产品篇·领域建模:一个文章系统有哪些实体、什么关系
成为全栈·产品篇·领域建模一个文章系统有哪些实体、什么关系本文目标带你做一件当纯前端时几乎从没做过的事——为数据「建模」而不是「渲染」。我会用本系列这个真实文章系统作案例把核心实体和它们的关系拆给你看并讲清几个「不对这意味着什么」的建模决策。读完你会明白为什么说「设计是常量」而实体关系就是那个不变量。前置知识建议先读 技术选型不是投票技术选型。本文是「设计是常量」里那个不变量的具体展开。你从没做过的事建模当纯前端时你面对数据是这样的constarticleawaitfetch(/api/articles/1).then(rr.json())returnh1{article.title}/h1div{article.content}/div你消费一个对象、把它渲染出来。对象长什么样是别人定好的。建模反过来现在问你——「要做一个文章系统数据该怎么组织」没有人给你现成的对象。你要自己决定有哪些「东西」值得单独记录、它们之间什么关系、每个字段是什么类型、状态怎么流转。这就是领域建模。它练的不是「消费 渲染」而是「抽象 约束」。我身边不少前端转全栈卡住卡的就是这第一步——不是语法不会是从没被要求「凭空把世界拆成表」。一、从需求到实体建模的第一步建模的起点是问对问题系统里有哪些「值得单独记录状态」的事物「值得单独记录」是关键。一个文章的标题不值得单独建表它依附于文章但「用户」值得——它有独立生命周期注册、登录、改资料、禁用。「评论」也值得——它有作者、内容、审核状态。把需求在脑子里过一遍凡是「能独立存在、有自己属性、会被增删改查」的基本就是实体。剩下的要么是实体的字段要么是实体之间的关系。关系只有三种记住就行一对一一个 A 对应一个 B少见多数可合并。一对多一个 A 对应多个 B最常见用「B 上挂 A 的外键」表达。多对多多个 A 对应多个 B用一张中间表表达比如「文章 ↔ 标签」。把这三种关系画出来更直观二、这个系统的核心实体把「文章系统」这个需求拆开本系列定下的核心实体如下完整定义见 02-领域模型与API契约这里只给总览┌─────────┐ ┌──────────┐ ┌────────┐ │ User │───1:N─▶│ Article │─N:N──▶│ Tag │ │ (作者/会员)│ │ (文章) │ └────────┘ └─────────┘ └────┬─────┘ │ 1:N │ 1:N ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Comment │ │ Category │─N:1─▶│ Category │ (自关联支持层级) │ (评论) │ │ (分类) │ │ (父分类) │ └──────────┘ └──────────┘ └──────────┘ ┌──────────┐ ┌────────────┐ ┌────────────┐ │ Favorite │◀─N:1─│ User │─1:N─▶│ ReadingLog │ │ (收藏) │ │ │ │ (阅读历史) │ └──────────┘ └───────────┘ └────────────┘ ┌──────────┐ ┌────────────┐ │ Like │ │ Attachment │ (附件一等实体) └──────────┘ └────────────┘实体一句话职责User系统只有一类账户靠role区分 admin / editor / memberArticle核心实体内容存 Markdown 源文渲染交给前端Category分类支持无限层级自关联Tag标签与文章多对多Comment评论有自己的审核状态Favorite会员收藏Like会员点赞ReadingLog阅读历史阅读量统计的底层Attachment上传的附件/图片是一等实体不是内部影子表ASCII 图是文字兜底下面这张可视化版本看得更清楚你看这已经不是「一个文章对象」了——它是一张关系网。作为前端你以前只摸过这张网里被裁出来的那一片 JSON建模让你看见整张网。三、几个「不对这意味着什么」的建模决策实体列表好列难的是决策背后的取舍。举四个本系列真实做过的决定让你感受建模的思维重量1. 用户不拆表靠role区分。会员中心和后台管理员本可以建两张表。但我们只用一张User表靠role字段区分权限。理由只有一个最大化「同一套 API 服务多端」的复用率。代价是权限判断要写在授权层这正是契约里x-authz要机器化保证的事。如果你当初拆成两张表后面六个端都要为「两套用户」写两套逻辑——地基就歪了。2. 文章内容存 Markdown 源文不存渲染后的 HTML。Article.content存的是 Markdown 源文渲染由前端负责。这是关注点分离存储层只管「数据是什么」表现层管「怎么画」。如果存了 HTML哪天换个前端框架旧 HTML 就成包袱。3. 主键统一整数自增不引入 uuid。所有实体主键用整数自增。在 SQLite 下是INTEGERPostgreSQL 下是BIGINT但语义一致。理由本期规模用不着 uuid 的分布式优势简单够用就是最优。过早上 uuid反而增加跨数据库适配的复杂度。4. 状态要显式建模成状态机。文章有三态draft / pending / published评论有三态approved / rejected / reviewing。它们不是随便写的字符串而是业务流程的可建模部分——哪些转移合法比如pending → published可以published → pending也可以但得有规则要在契约里机器化定义。状态机建模错了业务就会出「文章卡在审核态出不去」这种事故。顺手提醒建模时最容易栽的三个坑你写自己项目时能避开过度拆分什么都想建表结果十张表 join 一次查询。先问「它能独立存在吗」不能就做字段。搞反关系方向一对多时外键挂错边查询要反向扫全表。记住「多的那一侧挂对方 id」。把状态当普通字符串用自由文本存状态后面到处if (status xxx)一改名全崩。状态该是受约束的枚举最好机器化校验。坑的本质都是「没把关系和约束想清楚就动手」——建模慢一点后面省十倍返工。四、为什么建模是全栈最难的跃迁前端练的是「给定结构消费它、渲染它」——输入是确定的。建模练的是「没有结构创造结构并扛住它带来的约束」——输出要自己负责。而且它贵。用一个真实系统串起全栈 说过API 契约和领域模型是整个工程唯一的硬地基一旦定歪后面六个子项目全部返工。你前面学的 Hono、Drizzle、Next.js 都能边做边改唯独实体关系和契约不能——因为它们是所有端共用的「常量」。所以这一篇你不必背下每个字段但要建立一种新直觉看到需求先想「有哪些实体、什么关系、状态怎么流转」而不是直接想「页面怎么画」。这个直觉一旦长出来你再回头看前端那些「列表页」「详情页」会发现它们在你眼里已经变成了「某实体的集合视图」和「某实体的单个视图」——那一刻你就已经是全栈视角了。举个最小的例子体会这层追问产品说「用户能收藏文章」。前端会想「加个爱心按钮」建模者会想「要不要独立 favorite 表、用户删了收藏怎么办、文章删了收藏级联吗、收藏要不要进阅读历史」。这串追问就是建模的起点——它不写在页面上却决定了你后面写不写得出干净的后端。所以别嫌建模慢它在替你挡住最贵的返工。建模练的就是这种「先问清楚再动手」的肌肉练熟了后面的代码反而写得快。小结建模是「为数据建模而非渲染」——从空白需求拆出实体和关系这是纯前端极少练的能力。实体 值得单独记录状态的事物关系只有一对一、一对多、多对多三种。本系统的核心实体是一张关系网User / Article / Category / Tag / Comment / Favorite / Like / ReadingLog / Attachment不是孤立的文章对象。真正的建模功力在决策取舍单用户表靠 role、Markdown 源文、整数主键、状态机——每个决定都有代价和理由。建模是全栈最难的跃迁也是唯一不能返工的地基它长出的「先想实体再想页面」的直觉就是全栈视角本身。延伸阅读《技术选型不是投票——本文说的「设计是常量」就是实体关系这个不变量。{{LINK:M0-05}}《契约先行》——实体定好之后下一步是把它们暴露成接口。订阅这个专栏本系列专栏https://blog.csdn.net/fungleo/category_13204651.html订阅看全部篇章完整项目仓库https://github.com/fengcms/become-a-full-stack-developer

相关新闻

SiC MOSFET凭什么取代IGBT?大型光伏逆变器的技术逻辑与工程细节

SiC MOSFET凭什么取代IGBT?大型光伏逆变器的技术逻辑与工程细节

2026/8/29 0:19:40

前阵子看到 onsemi 宣布 EliteSiC MOSFET 要集成进 Sineng(上能电气)的公用事业规模光伏逆变器,圈内不少朋友在转发。这条消息在行业外的人看来可能只是一份常规的供应商合作声明,但站在电力电子开发的视角,它其实说明…

物联网补丁自动化:破解IoT设备安全运维与固件升级困局

物联网补丁自动化:破解IoT设备安全运维与固件升级困局

2026/8/29 0:19:40

物联网安全圈子里有个现象很有意思:一说补丁管理,大家第一反应都是服务器、PC、虚拟机那套流程,可真到了摄像头、门禁控制器、医疗监护仪、PLC这些 IoT 设备上,传统补丁流程几乎是废的——设备种类杂、厂商各自为政、固件更新周期…

人工智能是典型的多学科交叉融合形成的综合性学科,其学科边界可从定义、涉及学科、应用分支

人工智能是典型的多学科交叉融合形成的综合性学科,其学科边界可从定义、涉及学科、应用分支

2026/8/29 0:19:40

人工智能是典型的多学科交叉融合形成的综合性学科,其学科边界可从定义、涉及学科、应用分支三个维度明确: 核心定义 狭义上,人工智能属于计算机科学的分支,研究如何用计算机模拟或实现智能,使机器具备类人智能能力。目…

AI团队如何通过研发税收抵免降低定制开发成本

AI团队如何通过研发税收抵免降低定制开发成本

2026/8/29 1:29:43

1. 背景:为什么 AI 团队需要关注研发税收抵免1.1 研发税收抵免到底是什么在 AI 项目交付过程中,大部分研发团队的注意力都集中在模型效果、推理性能和上线时间上,很少有人会认真思考一个问题:当前投入的大量人力与算力成本&#x…

HTML5原生前端实践:三农可信官网零框架搭建指南

HTML5原生前端实践:三农可信官网零框架搭建指南

2026/8/29 1:29:43

简介:HTML5不仅是网页开发基础标准,更是构建可信数字服务的核心技术栈。其语义化标签、本地存储、Canvas绘图、表单原生验证与SVG矢量能力,共同支撑起无需框架即可实现的高鲁棒性应用。在农业数字化场景中,这些原生能力直接转化为…

LibGDX项目逆向工程实战:从残缺源码解构构建链路与资源架构

LibGDX项目逆向工程实战:从残缺源码解构构建链路与资源架构

2026/8/29 1:29:43

简介:LibGDX是Java跨平台游戏开发的主流框架,其依赖管理、资源加载与模块化设计具有典型工程复杂性。理解其底层原理——如Maven依赖传递机制、JVM模块系统(--add-modules)与ClassPath资源解析逻辑——是诊断构建失败、路径异常等…

光进铜退:数据中心光互连技术的工程落地与实战指南

光进铜退:数据中心光互连技术的工程落地与实战指南

2026/8/29 1:29:43

最近关于数据中心网络的技术讨论里,“光进铜退”是一个绕不开的方向。看到行业里创业公司围绕“用光替代数据中心线缆”做融资和产品布局,说明这类技术正在从实验室走向工程落地。本文不讨论具体公司的商业估值,而是聚焦背后的技术链条&#…

Sil-Net:基于轻量级AI与DSP的智能静默期语音传输系统设计

Sil-Net:基于轻量级AI与DSP的智能静默期语音传输系统设计

2026/8/29 1:29:43

1. 项目概述:从“静默”到“感知”的桥梁 最近在整理一些旧项目时,翻到了一个名为“Sil-Net”的代码仓库。这个名字乍一看有点抽象,Sil是Silence(静默)的缩写,Net自然是Network(网络&#xff09…

蓝桥杯国赛“答疑”题解:贪心算法在调度优化中的应用与证明

蓝桥杯国赛“答疑”题解:贪心算法在调度优化中的应用与证明

2026/8/29 1:19:43

1. 项目概述:从“答疑”到“最优调度”的算法实战看到“第十一届蓝桥杯(国赛)——答疑”这个标题,很多参加过蓝桥杯的同学应该会心一笑。这可不是一个简单的问答环节,而是一道经典的算法题目,它考察的核心是…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/28 7:34:42

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

四款热门降AI工具测评:研究生和本科生怎么选?

四款热门降AI工具测评:研究生和本科生怎么选?

2026/8/29 0:09:39

马上要交论文了,最近真的被论文ai率折磨的够呛。 明明查重都没问题了,但是ai率就是居高不下,崩溃了,明明都是我自己写的,天杀的,明明都是我亲生的啊 改来改去,终于给我搞出一套完美的降ai方案…

论文降AI率免费攻略:自查、提示词与工具推荐

论文降AI率免费攻略:自查、提示词与工具推荐

2026/8/29 0:09:39

马上要交论文了,最近真的被论文ai率折磨的够呛。 明明查重都没问题了,但是ai率就是居高不下,崩溃了,明明都是我自己写的,天杀的,明明都是我亲生的啊 改来改去,终于给我搞出一套完美的降ai方案…

北京GEO优化服务商推荐:预算型企业如何选北京GEO优化服务商?

北京GEO优化服务商推荐:预算型企业如何选北京GEO优化服务商?

2026/8/29 0:09:39

前言:预算有限的企业更关心投入能否形成可持续的品牌资产。评估北京GEO优化服务商时,不能只比较单篇内容或单月报价,还要看是否能够把问题词、官网、信源和监测串成完整链路。本期重点放在预算配置、试点范围和交付边界,帮助企业先…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…