很多做财务系统开发的朋友都碰到过这个需求,客户要一套系统支持多个独立法人同时用,还要求数据完全不互通。要么给每个客户单独建库,要么单独分表,维护起来麻烦到爆炸,运维成本能翻好几倍。
能不能只用一个数据库就搞定所有法人实体的数据隔离,还能符合财务合规要求?答案真的可以,现在很多大厂的SaaS财务系统,都是这么干的。
碰到多组织数据隔离,第一反应就是给每个法人建独立的库,物理隔离绝对安全。但客户多了之后,光数据库实例就能堆十几个,备份、升级、迁移都要挨个弄,出问题找半天才能找到对应库,开发运维都要疯。
还有人选择分表,同一个表给每个法人建一张,法人多了光表就能上百张,改个表结构要批量处理,写SQL的时候还要动态拼表名,一不小心就串数据,隐患太大了。
真正低成本易维护的方案,就是共享数据库共享表,只靠数据层面做隔离。这种方案现在已经是主流了,只要设计得当,安全性完全不输给物理隔离,成本还能压到最低。
所有需要隔离的业务表,只要加一个法人主体ID(org_id)作为共用的隔离字段就行。看起来简单,这里面的坑可不少。
你以为只要每个查询都加上org_id过滤条件就完事?不对,要是开发漏写了过滤条件,直接就能把所有组织的数据查出来,财务数据是核心敏感数据,这问题说大就能直接让产品翻车。
怎么从底层避免漏写的问题?可以在数据访问层做统一拦截,不管什么查询,自动把当前登录用户所属的org_id拼到查询条件里,从入口就把串数据的可能性堵死。哪怕开发忘了加,框架自动帮你加上,根本出不了问题。
外键关联的时候也要注意,所有关联表都必须带上同一个org_id,不能只靠主表的过滤就偷懒。就算是关联字典表这种公共数据,只要是和业务绑定的,也必须带上org_id,避免不同组织的配置数据交叉混乱。
财务系统对合规要求特别高,除了数据层面隔离,权限层面也要做多层校验。同一个法人下的不同部门、不同岗位,也要做权限隔离,不能让一个人看全公司所有数据。
比如出纳只能看自己负责账户的流水,会计只能看自己分管账套的凭证,这些权限都要和org_id绑定,上层做维度细分,下层靠org_id做物理隔离,双层防护才安全。
还有一个很容易被忽略的点,就是数据的审计留痕。所有对数据的修改、查询操作,都要把操作人所属的org_id一起记录下来,真出了问题溯源的时候,一眼就能查到是哪个组织的哪个操作出问题,完全符合监管对财务数据审计的要求。
很多人担心,所有数据放一张表,数据量大了会不会卡?其实只要索引做好,性能完全不用担心。必须把org_id做成联合索引的第一前缀,所有查询都是先用org_id过滤,再查其他条件,索引命中率特别高,哪怕百万级数据,查询速度也不会掉下来。
如果后续数据量真的涨得特别大,还可以按org_id做分库分表的扩展,现在已经有了org_id这个字段,后续拆分的时候根本不用改表结构,直接按org_id路由就行,扩展性拉满。
公共配置类的数据怎么办?比如通用的会计科目、国家地区编码这种所有组织共用的数据,不用每个组织都存一份,只需要存一份全局的,然后通过中间表绑定对应org_id的使用权限就行,既节省存储空间,又不会乱。
切换数据源的动态操作要做好,有时候需要给特殊的跨组织查询做权限放开,这时候就能手动跳过拦截器的org_id过滤,前提是必须做严格的权限校验,只有超级管理员才能操作,普通用户根本碰不到。
新建法人组织的时候,不用动库动表,只要往组织主表插一条数据就行,一分钟就能完成新建,特别适合SaaS模式给客户开新租户,效率比单独建库高太多。
数据备份也省心,不用备份一堆库,只要备份一个库就行,还可以按org_id做单组织的数据导出恢复,单个法人要迁移数据,直接按org_id导出所有相关数据就行,不用动其他组织的数据,太方便了。
这种一个数据库支持多法人的隔离方案,已经在大量生产环境验证过,既满足了财务数据隔离的安全性要求,又把开发和运维的成本降到最低,特别适合多组织的财务系统、SaaS ERP这类产品落地。只要把org_id的设计做扎实,从框架层做好拦截,根本不会出现串数据的问题,用起来比物理隔离省心太多。

