2026-01-15 02:01:07
要让前端程序员无需后端也能完成项目,可通过构建“Backend as a Database”(BaaD)架构实现。该架构将后端功能抽象为数据库操作,结合权限控制、视图表、物化视图、批量查询、存储过程等技术,使前端直接通过RPC接口访问和操作数据,同时满足业务规则校验、性能优化和安全需求。
一、核心架构设计:BaaD 的分层模型BaaD 的核心思想是将后端拆解为多个预设概念层,前端通过统一接口访问数据,无需直接编写后端代码。具体分层如下:
行/列级权限需动态校验,且开销不能过大。
支持临时授权(如工单分配)、匿名访问和机器人账号。
多项目用户体系互通需统一身份管理。
外层权限服务:在数据库外构建权限校验层,通过装饰器(如@Biz.profile)标注角色权限,例如:
@Biz.profile('买家', 'read')@Biz.profile('管理员', 'read', 'create', 'update', 'delete')export class Order extends Biz.ActiveRecord { ... }动态授权模式:按需开启行级权限,减少开销;支持匿名访问提权和机器人账号初始化。
跨项目身份映射:通过统一身份服务(如OAuth 2.0)或代理账号实现多项目用户互通。
直接暴露单表查询无法支持聚合(如SUM、COUNT)和关联查询(如JOIN)。
按需计算聚合结果性能差。
视图表:将复杂查询建模为虚拟表,前端仍以单表形式访问。例如:
@Biz.view(`SELECT user_id, SUM(cost) AS total FROM Orders GROUP BY user_id`)export class UserTotal extends Biz.SqlView { ... }物化视图:预计算聚合结果并存储,通过SQL定义刷新规则(如依赖表变更时触发)。例如:
@Biz.view(`SELECT ... FROM Orders JOIN Users ON ...`, { materialized: true, refresh: 'binlog' })export class UserOrderSummary extends Biz.SqlView { ... }批量查询接口:支持前端提交查询数组,后端合并执行。例如:
const results = await backend.batchQuery([ { table: 'Orders', where: { user_id: 1 } }, { table: 'Products', where: { category: 'electronics' } }]);前端缓冲聚合:通过全局缓冲池收集多个组件的查询,在“合适时机”(如组件卸载时)批量提交。
协作数据(如订单)需多方协商修改,不能由单一用户决定。
存储过程执行时间过长影响稳定性。
JavaScript存储过程:用FaaS(如AWS Lambda)实现复杂逻辑,例如:
// 订单价格校验存储过程exports.handler = async (event) => { const { items } = event; const total = items.reduce((sum, item) => sum + item.price * item.quantity, 0); if (total !== event.declaredTotal) throw new Error('价格不匹配');};分段执行与事件驱动:将长流程拆分为多个存储过程,通过事件表(如Kafka)串联。例如:
插入订单表,触发OrderCreated事件。
订阅该事件的存储过程异步执行库存扣减、通知发送等操作。
中小型项目,业务规则相对简单。
需要快速迭代,前端主导开发流程。
数据权限和聚合查询需求明确。
复杂业务逻辑(如实时风控)仍需后端支持。
高并发场景需优化物化视图刷新和权限校验性能。
通过BaaD架构,前端程序员可独立完成数据访问、权限控制、复杂查询和业务规则校验,显著降低对后端的依赖,实现高效全栈开发。