为每个Django Model实例创建数据库

时间:2011-07-26 16:05:52

标签: database django model instance

我有一个“主模型”,有很多“儿童模特”: 我知道会有很多数据(通过子节点),我想动态地将该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 dictionnary以添加新数据库:'mastermodel_1_db','mastermodel_2_db'
  2. syncdb(用于在该db上创建模式/表)
  3. 然后使用自定义DatabaseRouter管理数据库事务
  4. 像这样:

    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
    

    我是正确的吗?

1 个答案:

答案 0 :(得分:0)

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

如果你真的相信(并且可能有一些数字来支持它),你所处理的数据大小实际上会对你的系统征税。这些是你应该采取的步骤:

  1. 更好的硬件。硬件比开发者时间便宜。
  2. Partitioning
  3. 正确完成分片(你提议的不太可能是正确的分片方法)
  4. 值得注意的是,1和2一起应该能够(在大多数情况下)使用数十亿行的表格。

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

      

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

         

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