多公司数据库设计选单表加company_id还是按公司单独建表?
方案选型结论
结合你给出的业务约束,选择单表加company_id字段区分公司数据的方案1更合理,完全不需要做按公司分表的方案2。
方案1的适配优势
- 性能完全满足需求:15家公司、单类业务表单家最高3000条数据的前提下,就算有10类不同的业务表,单表总数据量也不到50万条,这种量级对所有主流关系型数据库都不存在查询、更新性能瓶颈,每小时一次的全量更新也不会有压力。
- 维护成本极低:后续业务迭代需要调整表结构(加字段、加索引、修改字段属性等)时,只需要操作1次单表即可,不需要重复修改15家公司对应的所有业务表,能避免漏改、错改表结构导致的线上bug。
- 业务代码逻辑更简单:不需要动态拼接表名,所有查询、更新操作只要带上
company_id过滤条件即可,适配ORM框架也更方便,不会出现动态表名带来的安全、调试问题。 - 扩展性更强:后续如果新接入公司,不需要额外新建几十张业务表,直接写入数据即可,接入效率高很多;如果需要做跨公司的业务汇总统计,也不需要Union十几张表,查询逻辑更简洁。
方案2不适合你的核心原因
- 属于典型的过度设计:分表的适用场景是单表数据量达到百万、千万级以上,出现明显查询性能瓶颈的情况,你当前的总数据量远达不到需要分表的阈值,完全没必要额外增加复杂度。
- 维护成本指数级上升:如果后续接入公司数量增加、或者业务表类型变多,表总量会线性暴涨,光是对齐所有表的结构就要消耗大量不必要的精力。
- 业务逻辑复杂度陡增:所有表操作都需要先拼接对应公司的表名,很容易出现SQL拼写错误,也会提升SQL注入的风险。
额外优化建议
给所有业务表的company_id字段加普通索引,如果存在高频的company_id+其他业务字段的联合查询,可以搭配建联合索引,查询、更新效率会更高。
内容的提问来源于stack exchange,提问作者Jose
相关产品推荐
相关产品推荐

