作为后端开发如何设计数据库系列文章 设计SaaS系统表结构

在公司做了一年的SaaS内核系统,但是有些东西不知道能不能透露出来。我尽量在不透露一些敏感东西的情况下(这个度我无法把控,只能是笼统了),将某些关于数据库方面的精髓传递出来。如果表达不畅,请谅解。

前面的两篇讲解了在传统系统和大数据量下的数据库设计应该注意的事项。

接下来需要换一种思路,在SaaS系统中,数据库应该如何进行设计。

与传统开发的思考点不同,在SaaS中,可能更多考虑的是数据隔离(在这里考虑共享数据库,共享数据表),数据通用方面

租户id

既然是SaaS平台,那么肯定是多租户的一个生态。那么在数据库层面,一定要有一个字段来隔离数据。

这个字段在每个表都需要有,且每一次数据库的操作都需要有该字段作为条件。

这一步数据安全的控制都放在了代码中,所以安全性和隔离性都是要依赖编码的。

表的自增id

这个字段还是要有的,但是强烈建议不要在删除行数据,查询数据,修改数据时使用到该字段,因为该字段的单独操作会破坏掉数据的隔离性。也就是前面所说的,所有的sql操作,都要带上租户id再进行。

数据来源标识

作为SaaS平台,在很多情况下,不同的租户可能有一样的数据,或者是通过某些编程,或者是通过配置的方式,通过一套标准数据生成了各个租户的数据。可以实现租户的自定义。

但是在某些情况下,可能某个特性不需要租户进行自定义,而是SaaS系统进行一个控制,那么就需要一个标识,来知道这个数据来源一致。

需要确定的是,这个标识,在这个租户下是唯一的。也就是说,前面的自增id没有用,但是这个标识和租户的id是可以唯一索引到一条数据的。

强烈建议使用租户id和数据的来源标识进行操作数据。

元数据

元数据用一句话就是描述数据的数据

在SaaS中,存在着一些通用配置,通过这些通用配置,可以自由定义一些业务模型,可以极其快速的实现业务需求。

这个元数据,我正在公司负责这块,但是可能不能透露。

简单的说几句,元数据能用非关系型数据库就不要用关系型数据库。前期量级小的时候问题,后面访问量,压力很大。

其次,通用的一些业务模型,一定要抽取出来。元数据对业务来说是极其基础的存在的,业务不应该感知到元数据的存在。业务感知的应该是元数据的一些业务组合,也就是业务模型。

通过组装业务模型,可以配合不同的业务场景,最后实现业务功能。

租户数据

租户的数据,是基于一些元数据来生成的,所以是可扩展的。在这里,也建议不要使用关系型数据库,因为不太适合,非关系型数据库更加适合SaaS系统这个体系。

其实东西很多,但是暂时先讲到这了,我也不知道某些东西是不是属于公司的,前些日子我们公司刚爆出了员工透露公司机密到网上,所以。。。

最后讲下吧,如果要做SaaS系统,一定要考虑长远,不要先被业务拖累。如果在半年一年内无法脱离业务需求来架构设计与开发SaaS系统,那么我的建议是,不要做什么SaaS了,开发业务吧,不然公司都活不下去的。

整篇看上去会比较理论,但是实际上,这些都是实践后的一些理论点。有很多的一些东西,我无法分享太多,非常抱歉。这次也是借这个阿里云活动的机会,分享一点出来。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重学 VBA - 基础与实战篇(含正则表达式)

目录 前置内容1. 单元格对象属性与方法1.1 查找最后的行、列1.1.1 End 属性1.1.2 SpecialCells 和 UsedRange1.1.3 Find 方法1.1.4 四种方法属性效果比较1.2 多重循环(案例)1.2.1 实现数据之间的匹配(不同列)1.2.2 实现数据之间的匹配(同列)1.2.3 排序 - 简单选择排序法1…

js 时间比较大小

const startTime parseInt(this.timeValue.replace(:, ));const endTime parseInt(this.timeValue2.replace(:, ));//进行比较if (startTime > endTime) {//添加校验提示console.log("startTime>endTime")} else {console.log("startTime<endTime&qu…

新一轮支付革命,利楚扫呗的数据库优化之路

中国移动支付市场崛起过程中&#xff0c;第三方、第四方等非银行支付机构在2017年至2019年之间&#xff0c;把移动支付交易量从300多亿笔拉升至近1800亿笔&#xff0c;充分彰显以扫码支付为代表的移动支付革命引领一时风潮。 利楚扫呗作为华中地区领先的金融收单企业也是其中一…

IM、RTC技术两生花,看融云如何打造“IM+RTC+Push”一站式通信云服务

11月9日&#xff0c;融云宣布完成数亿元人民币的D轮融资。从李佳琦和明星扎堆的电商直播&#xff0c;到疫情期间在线教育的全面普及&#xff0c;再到5G技术进入商用&#xff0c;实时音视频技术&#xff08;Real-Time Communication&#xff0c;以下简称RTC&#xff09;迎来了全…

Nginx实现通过不同的url前缀访问不同的前后端项目

&#xff0c;所以目前就可以通过给网页访问链接增加不同的url前缀&#xff0c;来让Nginx去实现同一端口下访问不同的前后端项目。具体配置如下&#xff1a; &#xff08;我这里是前端两个项目各自对应后端的两个服务&#xff09; server {#这里默认监听80端口&#xff0c;可根…

阿里云助力浙江大学信息化建设,以实时数据驱动校园智能管理

随着网络信息化技术的不断进步&#xff0c;就我国高校而言&#xff0c;传统的学习和生活模式已无法满足学生的需求&#xff1b;老机房堆硬件的建设&#xff0c;给信息化深度建设的管理和运维工作人员造成了巨大的麻烦。这些因素促使各所高校对校园智能管理的需求日益剧增。 20…

1 元秒杀 1000+ 册爆款电子书,错过再等一年!

wow代码人们让钱包瑟瑟发抖的双十一已经来啦与此同时码不停蹄地向你奔赴而来的还有 CSDN 为你准备的???? 1 元秒杀 ????价值 3.5 万元的爆款电子书限时特惠&#xff0c;仅需 1 元你&#xff0c;准备好了吗仅限 1000 人速领????????????错过悔10年系列好书

vue 单独页面定时器 离开页面销毁定时器

data: {return {timer: null} }, created() {this.timer setInterval(....); }, beforeDestroy() {if(this.timer) { //如果定时器还在运行 或者直接关闭&#xff0c;不用判断clearInterval(this.timer); //关闭} }

谊品生鲜:放弃传统数据库架构,全站上阿里云

疫情之下&#xff0c;生鲜电商的订单突然暴涨。 社区生鲜龙头企业谊品生鲜就是一个典型代表。它的在线交易量激增&#xff0c;日订单量超过10万单。 对电商企业而言&#xff0c;这对业务是个巨大的好消息&#xff1b;但对于IT、对于谊品生鲜的核心业务系统则是一个巨大的挑战…

教你一招,如何解决 “这台电脑无法运行 Windows 11” 的问题

目录1. 系统兼容性检测2. 为什么我的电脑不能运行Windows 11&#xff1f;3. 最低系统要求4. 如何开启 TPM 受信任模块5. 微软坚持最低要求的理由6. 最新补充6.1 更新支持的 CPU 列表6.2 旧电脑也能安装 Windows 11&#xff0c;但后果自负微软于 6.24 正式推出了全新的 Windows …

Flink SQL 的 9 个示例

作者&#xff1a;贺小令&#xff08;晓令&#xff09; 本文由阿里巴巴技术专家贺小令分享&#xff0c;社区志愿者郑仲尼整理。文章基于 Flink 1.9 版本&#xff0c;从用户的角度来讲解 Flink 1.9 版本中 SQL 相关原理及部分功能变更&#xff0c;希望对大家有所帮助。主要内容分…

如何破解“中国开源拿来主义”?包云岗的几点分析

作者 | 包云岗责编 | 王晓曼本文经作者授权转载自包云岗知乎以下视频是2011-2019期间全世界开源代码贡献最多的城市排名&#xff1a;旧金山一骑绝尘&#xff0c;其他主要是美欧城市&#xff1b;亚洲有东京、首尔上榜&#xff1b;莫斯科也贡献突出。但是&#xff0c;很遗憾没有中…

uni-app获取腾讯地图计算两经纬度的实际距离(可批量)

地址 https://lbs.qq.com/service/webService/webServiceGuide/webServiceDistance getDistance() {uni.request({url: https://apis.map.qq.com/ws/distance/v1/matrix, //仅为示例&#xff0c;并非真实接口地址。method: GET,data: {mode: walking,from: 39.071510,117.190…

JavaScript 常用工具函数

目录 1. 为元素添加 on 方法2. 为元素添加trigger方法3. 转义 HTML 标签4. HTML 标签转义5. 跨浏览器绑定事件5. 加入收藏夹7. 提取页面代码中所有网址8. 动态加载脚本文件9. 返回顶部的通用方法10. 实现base64解码11. 确认是否是键盘有效输入值12. 全角半角转换13. 版本对比14…

js获取数组中最大和最小值

文章目录1. 排序法2. 假设法3. 使用 Math 中的 max/min 方法4. 使用ES6的扩展运算符1. 排序法 // 数组中获取最大和最小值compareMaxMin() {const arr [12, 56, 25, 5, 82, 51, 22, 100, 2];arr.sort(function (a, b) {return a - b;}); // [5,12,22,25,51,56]const min arr[…

JS前端常用工具方法

目录 1. 邮箱2. 手机号码3. 电话号码4. URL地址5. 是否字符串6. 是否数字7. 是否Boolean8. 是否函数9. 是否为null10. 是否undefined11. 是否对象12. 是否数组13. 是否时间14. 是否正则15. 是否错误对象16. 是否Symbol函数17. 是否Promise对象18. 是否Set对象19. 是否是微信浏览…

JS向数组添加元素,插入数据

js中对于数组的操作很常见&#xff0c;下面记录一下js向数组添加元素的方法。 let myArray[11,22,33];console.log(原数组&#xff1a;,myArray);myArray.push(44,55);console.log(用push在数组后面插入元素&#xff1a;,myArray);myArray.unshift(66,77);console.log(用unshif…

小程序 获取腾讯地图计算两经纬度的实际距离(可批量)_多地打卡

文章目录一、小程序1. 安装vue-jsonp2. 引入腾讯sdk3. 实例化4. 二点求距离5. 多点求距离文档地址&#xff1a;https://lbs.qq.com/service/webService/webServiceGuide/webServiceDistance申请开发者密钥&#xff08;key&#xff09;&#xff1a; 申请密钥一、小程序 1. 安装…

前端常用 JavaScript 方法封装

目录 1. 输入一个值,返回其数据类型**2. 数组去重3. 字符串去重4. 深拷贝 浅拷贝5. reverse底层原理和扩展6. 圣杯模式的继承7. 找出字符串中第一次只出现一次的字母8. 找元素的第 n 级父元素9. 返回元素的第n个兄弟节点10. 封装mychildren,解决浏览器的兼容问题11. 判断元素…

H5 移动端 获取腾讯地图计算两经纬度的实际距离(可批量)_多地打卡

文章目录一、H5移动端1. 安装vue-jsonp2. 引入腾讯sdk3. 实例化4. 二点求距离5. 多点求距离文档地址&#xff1a;https://lbs.qq.com/service/webService/webServiceGuide/webServiceDistance一、H5移动端 1. 安装vue-jsonp npm i -S vue-jsonpmain.js //解决跨域 import {Vu…