You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django中为每个用户创建独立工时数据表的可行性及性能疑问

工时表应用Django实现与SQLite性能问题解答

一、为每个用户创建独立工时表是否可行?

技术上能实现,但强烈不推荐,原因如下:

  • 代码维护成本爆炸:Django ORM是为固定结构的表设计的,动态生成用户专属表需要写大量自定义逻辑,包括动态模型生成、手动处理迁移、原生SQL查询等,后续迭代和排障会非常麻烦。
  • 数据库结构臃肿:600个用户就会生成600张结构重复的表,备份、迁移、数据库管理都会变得异常混乱。
  • 违反数据库设计范式:单表加用户外键就能实现数据隔离,完全没必要重复造表结构,不符合数据库归一化设计原则。

正确的方案是:

  1. 保留Timesheet模型与User一对一关联,存储职位、客户等用户的公司相关信息。
  2. 创建统一的DailyTimesheet模型,通过外键关联Timesheet(或直接关联User),存储每日工时数据。

示例模型代码:

from django.db import models
from django.contrib.auth.models import User

class Timesheet(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    position = models.CharField(max_length=100)
    client = models.CharField(max_length=100)
    # 其他公司相关字段

class DailyTimesheet(models.Model):
    timesheet = models.ForeignKey(Timesheet, on_delete=models.CASCADE)
    work_date = models.DateField()
    project_name = models.CharField(max_length=100)
    hours_spent = models.DecimalField(max_digits=5, decimal_places=2)
    feedback_rating = models.IntegerField(null=True, blank=True)
    # 其他每日数据字段

查询某个用户的工时数据时,只需用DailyTimesheet.objects.filter(timesheet__user=目标用户)即可,既能实现数据隔离,又能保持代码简洁易维护。

二、SQLite存储15万条记录的检索性能问题

15万条记录对SQLite来说完全在承受范围内,只要做好基础优化,长期检索不会有明显变慢:

  • 给核心查询字段加索引:比如DailyTimesheet的timesheet、work_date字段,这两个是用户查询每日数据的常用过滤条件,加索引后能大幅降低查询耗时。
  • 避免全表扫描:查询时务必指定过滤条件(如用户、日期范围),不要直接查询全表数据。
  • 按需归档旧数据:如果业务允许,可定期归档超期的历史数据;若需要长期保留,SQLite也能支撑百万级别的数据量(只要磁盘空间充足)。

如果未来数据量增长到百万级以上,或需要高并发查询,再考虑迁移到PostgreSQL、MySQL等数据库即可,当前规模下SQLite完全够用。

内容的提问来源于stack exchange,提问作者SAP ASFlash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:52:34