后端基础、资料库、API 设计、程式架构
后端基础
- Git 和 Git Flow 是什么?如何应用?
- Git = 一组不可变对象(blob / tree / commit)+ 一个索引(index)+ 工作区(working directory)
- blob = 文件内容本身(不可变内容快照),tree 就是整个项目的目录结构,不是 index。index = 暂存区(下一次提交的准备区),commit = 时间轴节点(指向 tree + 指向父节点)。
- Git 在执行 git add 时,会把文件内容存成不可变的 blob,并写入 index(暂存区),记录下次提交要包含哪些文件;
- 当执行 git commit 时,Git 会根据 index 生成一个 tree 目录快照,再创建一个 commit 记录时间与历史链接。
- blob 存内容,tree 存目录结构,commit 才构成真正的时间轴,而所有对象都以 hash 作为唯一身份。
- Nginx 是什么?有哪些用途?
- Nginx 是一个轻量高效的 Web Server,它可以把所有用户请求集中到前端入口,由 Nginx 负责调度转发、分流、缓存,而应用服务器只专注处理逻辑。这让系统更安全、更快、更稳定,也能轻松扩展。
- 核心用途
- 反向代理、Nginx 站在最前面,把所有进来的 HTTP 请求转给后端应用。 后端不用暴露在公网上。
- 负载均衡、Nginx 是流量分流器,多台后端变成“一台好像无限大”的服务器。
- HTTP 缓存。超高速的前端缓存层,把热门内容存内存,直接返回给用户。
- 什么是 CDN?为什么要用 CDN?
- CDN = Content Delivery Network = 内容分发网络。
- CDN = 在全球布满缓存节点,让用户就近取得内容,而不是跑到你原始服务器那边取。这样可以极大降低延迟、分散流量、避免单点故障、增强安全性,是现代网站性能优化的不可缺的一层。
- 什么是快取 (Cache)?快取 (Cache) 的机制为何?
- Cache 是把高频、耗时、读多写少的数据放进内存加速访问。它能显著降低数据库压力,但会带来一致性和并发问题,因此常用 Cache Aside、Read/Write Through、Write Behind 三种模式来设计,同时必须正确处理穿透、雪崩、击穿和热点等风险。
- JWT 的运作原理是什么?
- JWT(JSON Web Token)是一种无状态认证机制。让服务端在“不存储登录状态”的情况下,判断用户是否已经认证过。
- 服务器“不记得你”,你必须每次带身份证(Token)来证明身份。状态就是记得不记得。现在就是直接验证。
- TCP 与 UDP 是什么?差异为何?
- TCP 全名 Transmission Control Protocol 是一种面向连接的协定。三次握手、可靠、有序、重传、拥塞控制 → 慢但稳。
- “握手(Handshake)”指的是:通信双方在正式传输数据前,为了确认彼此“准备好了”而进行的协议交换过程。
- UDP 全名为 User Datagram Protocol,无连接、不可靠、不重传、无序、超快速 → 用在实时应用。
- 限流器 (Rate Limiter) 是什么? 有哪些限流策略?
- 限制请求的速度,让系统不会被大量请求压垮。
- 令牌桶(Token Bucket),固定窗口(Fixed Window),滑动窗口(Sliding Window)
- 权限管理设计:ACL、RBAC
- ACL (Access Control List 存取控制清单),透过加入清单 (list),让使用者直接获得权限 (access)。
- RBAC 是 Role-based Access Control 的简写,用中文理解是「基于角色的存取控制」。
- session-based 与 token-based 的验证,有什么不同?
- Session-based = stateful(有状态)服务器必须保存 session,意味着服务器需要记住每个用户的登录状态。
- Token-based = stateless(无状态)服务器不保存登录状态,只要 token 自己能证明“你是谁”,后端就能验证。
API 设计
- 什么是 RESTful API?从日常生活理解 REST 架构原理
- API(Application Programming Interface,应用程式界面)
- REST 是指 Representational State Transfer(表征状态转移)
- 无状态、可缓存、客户端/服务器分离、分层架构
- 什么是 GraphQL?
- GraphQL 是一种用于 API 的查询语言
- GraphQL:单一端点 + Query 字段表达需求,一次请求 → 拿到多个资源 → 精确到字段级别。
- GraphQL 用单一端点让客户端自己决定要哪些字段;优点是精准、一次拿齐、扩展性强;缺点是复杂、易产生性能问题、安全风险更高。
- SOAP vs REST:如何选择?
- SOAP(Simple Object Access Protocol)是一种基于 XML 的网路通讯协议,用于在网际网路上进行分散式计算。
- XML(eXtensible Markup Language)是一种用于描述数据的标记语言。
- SOAP 是严格的 XML 协议,强调安全性、可靠消息传递和事务支持,常用于银行、保险这种企业级系统。
- REST 是一种基于 HTTP 的轻量架构风格,使用 JSON,资源导向、性能更好、可扩展性高,是 Web 与移动端最主流的 API 方式。
- API 设计 — 如何设计稳定可预测的 API (谈幂等性)?
- API 设计的一个关键特性:可预测性 (predictability),即在各种正常与异常情境下,API 的行为必须稳定一致。最核心的工程方法就是:幂等(Idempotency)。
- 幂等是指一个 API,无论你调用 1 次还是 10 次,服务器的最终状态都应该一样,不会因为重复请求造成额外副作用。
- 幂等钥 (idempotent key)第一次收到这个 key → 处理请求并记录结果,之后再收到相同 key → 直接返回第一次的结果,不重复执行
资料库
- SQL JOIN
- SQL 是 Structured Query Language 的缩写,中文叫结构化查询语言。
- SQL JOIN 对两个资料列集合,进行集合运算,接受两个集合,再产生一个新的集合。
- INNER JOIN 取交集(双方都有的数据),LEFT JOIN 取左表全部并补上右表匹配的数据(可继续用 IS NULL 找出左表无匹配者),RIGHT JOIN 与 LEFT 对称,FULL JOIN 取并集(不论是否匹配都保留),而 FULL/LEFT/RIGHT JOIN + IS NULL 则可以用来找“不匹配”的资料。
- FROM 选“主表”,JOIN 选“要合并的表”,ON 定义“怎么匹配”,WHERE 决定“最后留下哪些 rows”。
SELECT orders.*
FROM users
RIGHT JOIN orders
ON users.user_id = orders.user_id
WHERE users.user_id IS NULL;
- 什么是资料库正规化?为什么需要正规化?
- 资料库正规化:把表格拆成“结构良好、没有重复、不会更新出错”的样子。目标只有两个:减少重复、避免更新异常。
- 1NF(第一范式):每个栏位必须是“单一值”
- 2NF(第二范式):非主键必须“完全”依赖主键
- 3NF(第三范式):非主键 A 不能依赖非主键 B(即 A 不应该通过 B 才找得到主键)。
- BCNF(Boyce–Codd 范式):不能出现“非主键栏位决定主键栏位”的情况。
- 什么是资料库反正规化?优缺点是什么?
- 资料库反正规化是在原本正规化的基础上,故意增加冗余字段、预合并表或预计算数据,以减少 JOIN、提升查询效能。典型技术包括预先 JOIN、镜像表、表拆分、存推导值。
- NoSQL 是什么?请说明 NoSQL 资料库的特点
- Non-SQL 后来转解为Not Only SQL:动态数据结构。
- Key-Value 极快、Wide Column 扛大数据、Document 超灵活、Graph 专攻关系网。
- ACID 是什么?请解释 ACID 特性
- ACID 是数据库事务必须满足的四个关键特性,用来保证数据在关键操作下不会出错。
- A(Atomicity,原子性):事务要么全部成功,要么全部失败,不能出现部分执行。
- C(Consistency,一致性):事务前后系统必须保持逻辑正确,不会出现违反约束的状态。
- I(Isolation,隔离性):并发事务之间互不影响,避免读到脏数据或不一致数据。
- D(Durability,持久性):事务提交后数据不会丢失,即使系统崩溃也能恢复。
- ACID 让数据库的事务操作变得可靠、可预期,避免像“扣了钱却没下单”这种事故。
- ORM 是什么?ORM 的优缺点是什么?
- ORM = Object-Relational Mapping(物件关系映射)用“写代码操作对象”的方式,间接帮你生成 SQL,并操作数据库。
- 不用 ORM 的写法(直接写 SQL)
cursor.execute("SELECT * FROM users WHERE id = 3;")
result = cursor.fetchone()
- 用 ORM
user = User.objects.get(id=3)
- ORM= 翻译机,我们讲代码语言(Python/Java/TS 的 object/class)数据库只听得懂 SQL,ORM 就是负责「把你的代码翻译成 SQL」。