【问题标题】:create database for each Django Model instance为每个 Django 模型实例创建数据库
【发布时间】:2011-10-13 13:38:51
【问题描述】:

我有一个“主模型”和很多“子模型”: 我知道会有很多数据(通过孩子),我想将该 MasterModel 的每个新实例动态存储在一个单独的数据库中(及其所有孩子)

class MasterModel(models.Model):
    name = models.CharField()
    #db_connexion_name='mastermodel_1_db'

class ChildModelA(models.Model):
    mastermodel = models.ForeignKey(MasterModel)
class ChildModelB(models.Model):
    mastermodel = models.ForeignKey(MasterModel)
    child = models.ManyToManyField(ChildModelA)
    child = models.ManyToManyField(ChildModelA)
    class ChildModelC(models.Model):
    ...

有很多孩子和关系,但 MasterModel 对象之间从来没有

从现在开始,我想我必须这样做: 对于每个新的 MasterModel 实例(通过覆盖 save() 方法):

  1. 动态更新 settings.DATABASES 字典以添加新数据库:'mastermodel_1_db'、'mastermodel_2_db'
  2. syncdb(在该数据库上创建架构/表)
  3. 然后使用自定义 DatabaseRouter 管理数据库事务

像这样:

class MyDatabaseRouter(object):
    def db_for_read() / db_for_write() / ... :
        # for any model, return the database
        # of the mastermodel related object
        # like :
        if hasattr(model,'mastermodel'):
            return model.mastermodel.db_connexion_name

我走对了吗?

【问题讨论】:

  • 当您说“大量数据”时,您指的是什么数量级? 1GB? 100GB? 10TB?感觉这可能是方式过早优化来解决可能永远不会实现的问题。
  • 是的,这是一个badBADBAD的想法。如果负载是问题,那么有更好的方法来处理它。
  • 大量数据意味着对于每个项目(MasterModel),将有大约 30 个模型,每个模型都有 [10.000 到 500.000] 条记录(MySQL)

标签: database django model instance


【解决方案1】:

这听起来像是一个过早优化的大规模案例?想想你在做什么。您正在建立一个包含大量活动部件的系统,可能存在竞争条件,这很复杂且难以维护。在您还没看到数据之前,所有这些都会带来性能问题。

如果您真的确信(并且可能有一些数字可以支持)您正在处理的数据的大小实际上会给您的系统带来负担。这些是您应该采取的步骤:

  1. 更好的硬件。硬件比开发时间便宜得多。
  2. Partitioning
  3. 正确完成分片(您提出的可能不是正确的分片方法)

请务必注意,1 和 2 一起应该能够(在大多数情况下)将您带到具有 十亿 行的表。

您应该阅读:http://www.flounder.com/optimization.htm。特别是最后几行:

优化只在重要时才重要。当它很重要时,它很重要,但在你知道它很重要之前,不要浪费很多时间去做。即使你知道它很重要,你也需要知道它在哪里重要。如果没有性能数据,您将不知道要优化什么,并且您可能会优化错误的东西。

结果将是晦涩难懂、难以编写、难以调试和难以维护无法解决问题的代码。因此,它具有(a)增加软件开发和软件维护成本,以及(b)根本没有性能影响的双重缺点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2020-09-11
    • 2021-03-09
    相关资源
    最近更新 更多