Django环境下文档功能选两张独立表还是带类型字段的单表更高效?
Django文档存储方案选型与效率对比
直接给出结论:如果两类文档公共字段占比≥70%,带索引的单表加type方案效率更高且维护成本更低;如果两类文档独有字段占比高,双表独立存储方案综合效率更优。
核心效率对比(匹配你的业务场景)
你的业务有两类查询需求:单类文档展示、两类文档分开展示,两种方案的效率差异如下:
- 单表加
Type方案:- 只要给
Type字段加索引(如果常用过滤条件还有用户ID、创建时间,建议建联合索引),单类查询的filter(type="request/send")语句会直接走索引,耗时和查询独立表几乎无差异(差量在毫秒级,业务侧无感知) - 两类分开展示的场景,要么一次查询后按
type字段分组,要么两次带type过滤的查询,耗时和双表分别查询的差距可以忽略 - 额外优势:公共字段不用重复定义,模型、序列化器、通用CRUD逻辑都可以复用,后续迭代公共属性只需要改一次,研发效率比双表高很多
- 只要给
- 双表独立存储方案:
- 单类查询不用加额外过滤条件,不会出现漏写
type过滤的低级bug - 两类业务的字段完全独立,不会出现大量空值字段,存储利用率更高,查询时也不需要跳过大量无关字段,适合两类文档字段差异极大的场景
- 劣势:公共逻辑要写两套,后续加公共字段要同时改两张表,研发维护成本更高
- 单类查询不用加额外过滤条件,不会出现漏写
针对你的业务的落地建议
你的业务里申请文档有3种以上子场景、发送文档有2种以上子场景,可以按以下条件选择:
- 如果两类文档的公共字段(比如文档名称、上传时间、上传人、文件大小、文件链接等)占比超过70%,优先选单表方案:
可以额外加SubType字段区分各自的子场景,两个view的实现非常简单:- 仅展示单类的view:
Documents.objects.filter(type="request") - 两类分开展示的view:可以直接按
type排序后前端分组,或者用itertools.groupby在后端拆分即可
- 仅展示单类的view:
- 如果两类文档的独有字段占比超过一半(比如申请文档独有申请人、审批状态、审批流ID,发送文档独有收件人列表、发送状态、已读统计),优先选双表方案:
避免单表出现大量空值,也不用在业务逻辑里做大量type判断,两类业务各自迭代不会互相影响。
内容的提问来源于stack exchange,提问作者sixovov947
相关产品推荐
相关产品推荐

