文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何让前端程序员没有后端也能完成项目

2024-12-03 15:57

关注

答:Backend as a Database, Sort Of

直接把 Mysql 暴露在公网给前端使用会有什么问题:

要做到 Backend as a "Database",就是回答以上问题如何解决。

User 表

Mysql / Postgresql 的权限太粗了。肯定是要在 Mysql / Postgresql 外边套一层去校验权限。这里有如下的挑战要解决

解决了以上问题,我们就获得了一个内建权限的“Database”,可以开放到公网给前端访问。实际拉数据的时候,用的是人类用户自己的身份。只要用户自己对要访问的数据表或者行有权限,就可以访问到,否则就访问不到。

业务数据表

写一个 Typescript 的类,然后把 Mysql 的表建好。和 Java Hibernate 一样

  1. @Biz.profile('买家''read'
  2. @Biz.profile('店长''read''create''update''delete'
  3. @Biz.profile('管理员''read''create''update''delete'
  4. @Biz.authentic({ rowPolicy: 'public' }) 
  5. @Biz.published 
  6. export class RegionFreightTmpl extends Biz.ActiveRecord { 
  7.     @Biz.lookup 
  8.     public readonly freightTmpl: FreightTmpl; 
  9.     // 计费模式:按件(目前只有按件) 
  10.     public freightTmplType: string; 
  11.     public firstPrice: number; 
  12.     public firstAmount: number = 1
  13.     public additionalPrice: number; 
  14.     public additionalAmount: number = 1
  15.     public regions?: string; 

查询的时候直接用这个 class 来指代这张数据库表就可以了。

视图表

能够做好权限校验的前提是只暴露单表的简单查询。那么 count / sum / join 这些怎么处理? 难道是要发明一种 SQL 变种,然后搞 SQL 解析么?

一个简单的做法就是引入“视图表”的概念。把这些聚合查询都建模成一张虚拟的视图表。这样在查询的时候仍然是单表查询。

物化视图表

如果所有的聚合查询都要按需计算则会非常慢。经常我们需要一些按日期,按维度提前聚合好的中间结果。这个可以用物化视图表来表达

  1. @(Biz.view`SELECT id, gender, age, city, SUM(OrderItem.cost) AS total 
  2. FROM ${impactSet} 
  3. JOIN ${User} on User.id = impactSet.userId 
  4. LEFT JOIN ${Order} on User.id = Order.userId 
  5. LEFT JOIN ${OrderItem} on Order.id = OrderItem.orderId`) 
  6. @(impactSet`SELECT DISTINCT(Order.userId) AS userId FROM ${ Order }`) 
  7. @(impactSet`SELECT DISTINCT(Order.userId) AS userId FROM ${ OrderItem } JOIN ${ Order } on Order.id = OrderItem.orderId`) 
  8. @Biz.source(Starriness, { dataSource: 'clickhouse' }) 
  9. export class UserWithTotal extends Biz.SqlView { 
  10.     public readonly id: string; 
  11.     public readonly userId: string; 
  12.     public readonly created_at: Date; 
  13.     public readonly total: number; 

物化视图的问题在于什么时候刷新。通过用 SQL 定义 impactSet,我们可以由 mysql binlog 触发物化在 clickhouse 中的物化视图表刷新。

用户行为表

物化视图的来源是业务数据。用户行为因为数据量比较大,不太适合直接插入到 mysql 中。把用户行为单独提供一张宽表来记录用户做过什么操作。写入可以是内存缓冲,或者经过 kafka 这样的队列缓冲。

宽表的列应该是按业务需求扩展的,如果业务上关心用户操作的订单id,或者商品id,则要加上这些字段。大概的 api 也类似 mixpanel 这些老牌分析厂商的上报接口。

物化视图在计算报表的时候可以 join 用户行为表和业务数据表来得出分析结果。

批量查询

一次 rpc roundtrip 只能发一条查询太慢了。那支持一个数组,一次可以提交多条查询就好了。至于前端代码中怎么把多个组件的查询聚合到一个 rpc 中,这个就看前端的 data query 框架是怎么来弄了。无非就是全局搞个 buffer,在“合适的时候”刷一下这个 buffer,批量查一次。

存储过程

细粒度的用户权限只能解决数据完全被一个用户拥有的问题。很多时候数据是协作数据,有多个 stakeholder,那么就必须经过协商好的规则去修改数据,而不是一个用户说了算。例如你可以决定今天的日记本里随便写啥,但是不能决定把今天晚饭的订单改成0。日记是你拥有的,但是订单是多个相关方都关心的。

解决业务规则校验后写入的问题就是存储过程了。前端同学肯定是希望用 javascript 来写存储过程。实际上就是所谓 FaaS 的云函数。本质上就是后端代码仍然有,只是换了一拨人来写。

如果业务规则比较简单,例如只是一个状态机的转换图,则可以用配置替代code。当然大部分时候,复杂的业务逻辑,上 javascript 是最直观的。

Data Migration

数据库表结构变更了肯定还是要写 SQL 来升级数据库的,标准做法没啥说的。

Backend as a Database

 

来源:知乎内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯