Django中存储在不同数据库的模型之间能否建立关联关系?
跨库关联方案可行性结论
- 原生ORM的跨库ForeignKey关联无法正常运行。目前主流框架的ORM、关系型数据库的外键约束都是默认基于单库设计的,跨库场景下会直接出现多个问题:
- 数据库层面无法创建跨库外键约束,关联数据的一致性没有底层保障
- ORM自带的关联查询、级联删除/更新逻辑全部失效,强行使用会直接报错或生成脏数据
- 即使你手动写逻辑兼容关联查询,后续维护成本会非常高,完全不值得为了开源适配做这么重的改造
更优的实现方案
结合你开源项目、敏感数据单独保密的需求,推荐两个优先级从高到低的落地方案:
方案1:单库存储+敏感字段加密(优先推荐)
不需要拆分数据库,所有模型仍存储在同一个库中,仅对用户密码、个人信息这类敏感字段使用加密字段类型存储(比如Django生态可用EncryptedCharField这类加密字段),加密密钥单独保存在服务端环境变量中,不提交到开源仓库。
对外公开数据库内容时,要么直接导出非敏感业务表的数据,要么导出全库时敏感字段都是无法解密的密文,完全满足安全要求。
优势:不需要修改任何现有业务逻辑,实现成本极低,也不会破坏原有的关联关系。
方案2:服务拆分物理隔离(适合中大型项目)
如果有强需求要求敏感数据和公开数据完全物理隔离,不要仅拆分数据库,直接把用户、权限相关的逻辑拆分为独立的鉴权服务,公开业务侧仅存储用户ID作为关联标识,所有用户敏感信息的查询、校验都通过鉴权服务的接口调用,不走数据库层的关联。
优势:数据完全物理隔离,安全性更高,适合用户量、业务量较大的项目。
劣势:需要做服务架构拆分,修改现有业务调用逻辑,实现成本远高于方案1。
内容的提问来源于stack exchange,提问作者Marcos
相关产品推荐
相关产品推荐

