【问题标题】:How to create new tables in Database for each day in Django如何在 Django 中的每一天在数据库中创建新表
【发布时间】:2018-04-11 15:04:03
【问题描述】:

我有一个理解问题,因为我正在考虑如何在 Django 或数据库中管理我的数据。

这是一个每天大约有 2000 行和 8 列的表格。我想将过去 10 年的所有日常数据存储到数据库中,并每天添加新数据。为每天创建一个数据库表是个好主意。在 Django 中,为每个模型创建一个表,但发明者并不打算在 Django 中创建 5000 个模型。

这是我使用原始 SQL 创建表的唯一方法吗?或者有没有我在文档中没有发现的方法?

【问题讨论】:

    标签: sql django python-3.x django-models mariadb


    【解决方案1】:

    对您提出的问题的简短回答是“是的,最快的方法是使用原始 SQL”,或者是动态创建新模型并运行 makemigrations 的变体。

    也就是说,在没有关于您的问题或任务的更多细节的情况下,我必须立即质疑您为什么要动态创建表。对于初学者来说,这将使您失去与架构的良好 Django 提供的 ORM 连接,而无需更多技巧(自动生成的模型、每日迁移、迁移期间潜在的错位数据、您的专用代码等) .一些想法:

    1. 对于几乎任何容量最小的基于 Web 的项目来说,2000 行几乎都不算什么。甚至每天。整整一年后,这只有 730k 行。假设您的访问模式具有正确的架构索引和 normalization,这对于 RDBMS 来说仍然可以忽略不计。
    2. 如果您确实需要计划分片,请考虑也许在年度或十年级别进行。 730K * 10 年只有 730 万行,这通常仍然在可忽略不计的范围内考虑(给定适当的规范化和索引)。

    如果这个问题的前因是你遇到了速度问题,那么我建议你需要好好想想你的数据模型的normalization,想想你需要在哪里添加索引。例如,如果您的默认数据模型无法提供适当的索引,则使用@lodb(快速手指!)的建议并手动告诉 Django 的 ORM 创建索引:

    class Meta:
        indexes = [
            models.Index(fields=['day',]),
        ]
    

    【讨论】:

    • 感谢您的解释。虽然每天的数据集有时比最初想象的要大,所以现在我在一张表中有大约 1300 万条记录,但没关系。该表每天仅查询 1-2 次以进行计算并创建图形。它也只需要一小部分数据集。速度并不那么重要,所以在这种情况下它是最好的解决方案。
    【解决方案2】:

    老实说,在 Django 中每天一张桌子并不是最好的方式,因为它会使整个框架更难使用:

    • 您需要每天创建一个新模型
    • 您需要每天进行迁移和迁移
    • 或者您将完全跳过使用 ORM

    如果速度是您每天保留一张表的原因,我会只使用一张表,在日字段上有一个数据库索引。它可能会慢一点,但它会让你的生活更轻松。

    您需要将此添加到您的模型定义中:

    class Meta:
        indexes = [
            models.Index(fields=['day',]),
        ]
    

    手册有更详细的解释:https://docs.djangoproject.com/en/1.11/ref/models/indexes/

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 2019-12-17
      • 2021-06-07
      • 2019-11-06
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多