为什么刷新页面后项目仍然存在?
用户创建项目后关闭浏览器,第二天继续查看。
只保存在前端内存中的数据会在刷新、换设备或程序重启后消失。
数据库负责持久化项目记录,定期备份用于误删和故障恢复。
设计删除、恢复、历史记录和数据保留周期时,需要理解持久化与备份策略。
理解软件如何保存、关联和查询数据。
项目与协作、数据模型、数据看板、订单与支付、内容与媒体
数据库是长期保存和组织业务数据的系统,数据模型定义对象、字段、关系和约束。
列表、详情、筛选、权限和流程都依赖数据结构,页面结构经常是数据模型的投影。
位于业务逻辑之下,为后端提供持久化、查询和一致性能力。
表、主键、外键、关系、SQL、索引、事务、NoSQL、ORM 和 Migration。
用户、项目、任务、订单、评论和权限都会映射为数据实体与关系。
应用进程负责计算,数据库负责持久保存和可靠查询。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
用户创建项目后关闭浏览器,第二天继续查看。
只保存在前端内存中的数据会在刷新、换设备或程序重启后消失。
数据库负责持久化项目记录,定期备份用于误删和故障恢复。
设计删除、恢复、历史记录和数据保留周期时,需要理解持久化与备份策略。
程序内存中的数据会随着进程重启消失。数据库把数据写入持久介质,并提供并发访问、权限、备份、约束和查询能力。
关系型数据库适合结构清晰、关系明确的业务数据。文件、缓存、搜索索引和日志可能交给其他专用系统。
设计“保存成功”时,要明确数据是否真正落库、是否允许撤销、何时与其他端同步。
关系型数据库把同类对象组织成表。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
销售录入客户名称、行业、联系电话、跟进状态和创建时间。
字段类型和约束不清,会出现空名称、错误日期或同一手机号重复录入。
Customer Table 定义 Column 与数据类型,每个客户是一行 Row,Constraint 保证必填、唯一和取值范围。
表单字段、默认值、可空规则和校验提示应与数据约束保持一致。
Project 表包含 id、name、status、owner_id、created_at 等字段,每一行代表一个项目。字段类型限制可存内容,例如整数、文本、日期和布尔值。
约束可以要求名称必填、状态只能来自枚举、编号唯一。数据模型越明确,接口和页面状态越稳定。
projects
┌────┬──────────────┬────────┬──────────┐
│ id │ name │ status │ owner_id │
├────┼──────────────┼────────┼──────────┤
│ 12 │ AI 设计系统 │ active │ 8 │
└────┴──────────────┴────────┴──────────┘表单控件、格式提示和错误状态都应与字段类型和约束对齐。
主键标识唯一对象,外键连接不同对象。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
成员可以参与多个项目,一个项目也包含多名成员,并且每个成员有不同角色。
把成员名单直接写进项目字段会难以查询、更新和保存角色信息。
User 和 Project 各自用 Primary Key 标识,通过 ProjectMember Join Table 保存双方 Foreign Key 与角色。
成员管理页需要设计加入、移除、角色修改、重复邀请和离职后的资源处理。
Project.id 唯一标识项目,Task.project_id 指向所属项目。这样数据库可以查询某项目的全部任务,也能保证引用关系有效。
一对一适合用户与唯一档案,一对多适合项目与任务,多对多适合用户与项目成员关系,通常通过中间表实现。
详情页中的关联列表、成员管理和筛选条件,本质上都来自实体关系。
SQL 用于选择、创建、更新、删除和关联数据。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
管理者筛选本月、华东地区和已成交订单,并按销售人员汇总。
数据分散在订单、客户和员工表中,需要准确关联与聚合。
SQL 通过 WHERE 筛选、JOIN 关联多表、GROUP BY 汇总,形成页面需要的 Query 结果。
设计指标时同步定义时间范围、状态口径、维度和空值规则。
SELECT 查询,INSERT 创建,UPDATE 修改,DELETE 删除,JOIN 把相关表连接起来。WHERE 负责筛选,ORDER BY 负责排序,LIMIT 负责分页。
页面上的搜索、筛选、排序和分页最终会变成查询条件。复杂报表可能需要聚合、分组和统计。
SELECT p.id, p.name, u.name AS owner
FROM projects p
JOIN users u ON p.owner_id = u.id
WHERE p.status = 'active'
ORDER BY p.created_at DESC
LIMIT 20;设计筛选器时同时考虑字段类型、组合规则、默认值和无结果状态。
索引让数据库快速定位数据,同时增加写入和存储成本。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
客服在上亿条订单中查询某个订单号和用户手机号。
没有合适 Index 时数据库可能执行 Full Table Scan,数据越多越慢。
为高频查询字段建立索引,并通过 Query Plan 检查数据库是否使用索引。
搜索交互要与真实查询能力匹配,避免提供无法高效支持的任意组合筛选。
没有索引时,数据库可能扫描整张表。索引像按字段建立的快速查找结构,适合高频筛选、排序和关联字段。
索引不是越多越好。每次新增和更新数据都要维护索引,错误索引也可能无法改善查询。性能优化需要结合真实查询和执行计划。
当大型列表搜索很慢时,问题可能来自查询和索引,也可能来自接口、网络或前端渲染。
事务把多个数据操作组织成一个完整单元。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
用户提交订单,系统需要创建订单、扣减库存并使用优惠券。
其中一步失败会产生“有订单但没库存”或“优惠券被扣却没有订单”等半完成状态。
数据库 Transaction 把相关操作放在一起;全部成功后 Commit,任一步失败就 Rollback。
提交期间展示处理中,失败后恢复优惠券和库存状态,不把中间状态暴露给用户。
转账需要同时减少一个账户余额并增加另一个账户余额。事务保证这些操作共同成功或共同回滚,避免只完成一半。
事务提供原子性、一致性、隔离性和持久性。跨多个微服务时,传统数据库事务难以覆盖全部系统,需要事件、补偿或其他一致性方案。
涉及支付、库存、名额和审批状态时,要设计处理中、失败恢复和最终结果。
不同数据系统解决不同访问问题,ORM 和迁移工具帮助代码管理数据库。
先看用户动作和业务风险,再理解技术为什么出现,以及它会怎样改变页面、状态和流程。
不同文章包含段落、图片、引用、视频和自定义模块,结构差异大。
固定关系表频繁变更字段会增加开发和迁移成本。
文档型 NoSQL 可以保存灵活的内容结构,同时核心用户和订单仍可留在关系型数据库。
灵活结构也需要版本、校验和编辑器兼容策略。
新版项目详情需要新增 risk_level,开发代码也要读取和写入它。
直接修改线上表可能导致旧版本代码报错或历史数据为空。
Migration 以可追踪步骤修改 Schema;ORM 把代码对象映射到数据库字段。
上线前要定义旧数据默认值、渐进发布和回滚方式。
MongoDB 以文档组织灵活数据,Redis 提供高速内存访问,Elasticsearch 专注全文搜索。关系型数据库仍然常作为核心业务数据源。
ORM 让开发通过对象和方法访问数据库;Migration 记录表结构如何从一个版本变化到下一个版本,便于团队和环境同步。
看到技术选型时先问数据形态、访问方式、一致性和规模,不要只看工具流行度。
为一个课程产品设计 User、Course、Lesson、Enrollment 四张表,标出主键、外键和关系。