方案中的方案

简介:

近日公司的项目开始重构,项目中的一些地方需要相对独立的解决方案。想出解决方案的落脚点倒没有花太多的时间,但是,就像我们定了一个目的地,我们只是看到了它,要达到那个地方,还要走上一段路。这其间,不断在选择,妥协,尝试中摸索,试图在这个情景之下找到一个最合适的方法,就好像你觉得你已经想好了一个方案,但是实际上,你还需要好多配套的方案,这让我思考良多。

以权限系统为例。我们做的是一个 Web 的管理系统,权限控制是很常规的需求,如果要说额外的考虑,那可能要算权限除了与逻辑有关,还与界面是相关的。关于这点,我之前没有接触过完整的方案。当然,在模板中去写 if 在我看来显示不算是一个好办法。从“角色”入手,权限的控制很快定下来,根据实际需求,一个用户一定且只能是一种角色。每种角色有不同的权限。

从关系上来看,角色与权限,是一个多对多的关系。同时,角色和权限都比较多,控制起来比较麻烦,所以,决定使用关系数据库来保存权限相关的数据。这看起来,哪怕和 Django 自己的那套权限系统都差不多,只是一个角色和组的区别。

后来我考虑,“权限”的定性问题。因为按之前的经验,如果一个事情,我们界定了原则,那么通常讨论起解决问题的方法时就要有效得多。大家一致肯定了这样一个事实,对于我们这个项目而言,“权限”是一种配置。那么对于配置,我们有这样的看法:

  1. 稳定,变化小。
  2. 项目运行时它不变化。
  3. 由开发人员维护。
  4. 应该写到 conf 文件当中去。

第 4 点很重要,因为它和我们之前决定了使用关系数据库来保存发生了矛盾。或者说,使用数据来保存配置也不是不可以,特别是对于复杂点的配置来说,这是很正常的做法,而且,这套权限配置,它也算得上是复杂的程度。

随之而来的,就是把配置,弄到数据库去之后产生的各种问题。

Q1. 如何存储?

前面说过,角色和权限是一个多对多的关系,按关系模型,应该使用三张表来建立模型。除去角色表,还需要有一个权限表,和一个角色和权限的关系表。但是,作为配置,数据存储应该是直观的,就像写到 conf 中一样。使用三张表来保存数据,没法做到一目了然,所以我考虑把这三张表合成一张表,不去遵循范式的要求。

角色是相对稳定的,并且大概只有个位数的数量级,它不需要单独建表保存,枚举的整数就可以了。同时,对于一个权限,它和所有角色的关系,因为角色的数量少,可以在一行中,建立多个字段来枚举所有角色。这样,在一张表当中,字段“权限名,角色1,角色2,角色 3……”就把权限配置完整地保存下来了。并且直接映射成一个二维结构。

如果日后角色有变动,要添加角色,那也只是修改表结构,添加一个字段的事。

Q2. 如何编辑?

配置只是变化少,不是变化。并且,在这里,变化少只是对于运营说的,开发过程中,这个权限是不断变化的,对于新需求要不断添加新的权限。这就涉及到如何去编辑这组配置的问题。如何是文本文件,那么可以直接打开,修改。但是,它写到了数据库,虽然只有一张表直观表现了数据,但是,直接在数据库的客户端中去编辑,一来效率低,二来不直观容易出错。

所以,为此,我们专门写了工具来做权限的编辑。

看来起没什么事了?我之前也这么想。

Q3. 多人协作怎么办?测试怎么办?

把配置存到数据库当中,看起来没什么问题,也容易管理。但是,它造成最大的问题在于,让多人协作泡汤了!让测试尴尬了!

就问一句,在开发过程当中,权限信息写到哪里?

测试用数据库?听起来应该是这样。但是上线时怎么办?开发的一项工作,就是去写这个配置。好不容易写完了,等到上线时,难道需要做一下差异化比较,然后把测试库中的权限信息同步到正式库。或者再去正式库中写一遍。

不管哪种方法,都不现实。

我曾想过,把权限信息单独存到一个 sqlite 中去,这个 sqlite 作为代码的一部分,配置信息本来也应该作为代码的一部分,上线时新的替换旧的就没有问题了。但是,使用 sqlite 没有办法多人协作,它是二进制数据。别人添加的权限,和我修改的权限没办法合并,只能后者覆盖前者。

又要使用数据库,又要区分测试库与正式库,还要能多人协作——最后我们定下来的方案是,存 SQL 语句!

具体地,开发时写数据到测试库,编辑工具中添加这样的功能,因为开发时都是在本机启动应用的,使用本机的 dump 工具,把数据库的数据导出 SQL 语句,这些个 SQL 文件进入版本库。上线时,根据自动化部署的配置,启动多个应用实例时,有一个特别的实例,它会把这些个 SQL 文件重新导到正式库,当然,导入之前会 drop 掉已有的表。配置类信息数量不大,重新建表花不了几秒钟。

把不断变化的 SQL 文件作为配置信息,成为代码的一部分,想想挻有意思的。


目录
相关文章
|
4月前
|
测试技术
优化if-else的11种方案
优雅编码不仅提升程序效率,也增进代码可读性与维护性。通过早返回减少嵌套逻辑、运用三元运算符简化条件判断、采用`switch-case`优化多分支结构、实施策略模式灵活应对不同情境、利用查找表快速定位处理方式、封装函数明确职责划分、应用命令模式解耦操作与调用、引入状态模式管理复杂状态变化、重构条件表达式以增强清晰度、运用断言确保前提条件、及合理异常处理等十大技巧,使代码更加精炼与优雅。
75 4
优化if-else的11种方案
|
2月前
|
编解码 前端开发 UED
多屏幕适配方案
【10月更文挑战第7天】
48 1
|
4月前
|
弹性计算 应用服务中间件 持续交付
阿里云应用方案
为拥有传统单体和微服务架构混合的电商企业提供阿里云应用方案。该方案利用阿里云服务器迁移中心(SMC)实现IDC服务器到ECS的快速自动迁移,并通过云效建立自动化部署流水线。微服务应用则采用企业级分布式应用服务EDAS进行无缝迁移。数据迁移方面,实施多租户隔离与统一管理规范,确保数据迁移的安全性与合规性。此方案旨在帮助企业平滑迁移上云,优化资源管理,加速业务响应,并保障数据安全与业务连续性,助力数字化转型。
|
7月前
|
移动开发 HTML5
小气泡功能在中的两种实现方案
小气泡功能在中的两种实现方案
56 0
小气泡功能在中的两种实现方案
|
7月前
|
SQL 存储 缓存
后端架构优化方案探讨
【2月更文挑战第6天】在当今互联网时代,后端的稳定性和高效性至关重要。本文从数据库设计、服务器负载均衡、缓存策略等方面,探讨了后端架构优化的方案,旨在提供一些实用性的建议。
|
7月前
|
存储 运维 数据库
不敢书面化的解决方案就不是好方案
不敢书面化的解决方案就不是好方案
|
存储 缓存 JSON
聊聊方案中心性能优化中做的缓存设计
总结国际站方案中心物流运费计算性能优化过程中面临问题、问题分析、解决思路以及整体解决方案
聊聊方案中心性能优化中做的缓存设计
|
数据采集 监控 网络架构
火力发电厂辅控网改造方案及网络架构分析
本文简要的介绍了火力发电厂辅控网改造后的通讯方式,对辅控网网络架构及数据采集方式进行了分析。
火力发电厂辅控网改造方案及网络架构分析
|
前端开发 JavaScript NoSQL
6款 Retool 最佳替代方案
本篇文章的目的通过低代码平台使用者的视角引出细节,了解他们为什么使用低代码平台以及会选择哪个低代码平台来加速内部系统的开发。
836 0
6款 Retool 最佳替代方案
|
SQL 缓存 测试技术
预告片优化方案
 看了一下代码,同时在线上做了观察压测。个人总结这个接口问题在于太过于依赖缓存,根本不会走DB。依赖缓存造成了依赖缓存的数据结构。首先要从缓存中取出一堆数据。而且要走两次,一次取正片的信息,一次取专辑内所有视频的信息。取出来的信息在CPU里计算筛选,排序。本身缓存取数据就比较快,再加上计算量大。其实我们并发量最大的api接口们都是采用这个模式设计的。调用的多了,我觉得我真是压测的狠的话,会造成CPU密集。其实现在的缓存之类的都可以持久化了,完全可以当数据库用。但是关系型数据作为一个长久的经典还有一个很重要的原因:保持一个IO和CPU使用的平衡。
预告片优化方案