我有一个“主模型”,有很多“儿童模特”: 我知道会有很多数据(通过子节点),我想动态地将该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()方法):
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
我是正确的吗?
答案 0 :(得分:0)
这听起来像是一个过早优化的大案例?想想你在做什么。您正在建立一个拥有大量活动部件的系统,这些系统可能存在竞争条件,这种情况很复杂且难以维护。所有这一切在您看到数据之前都会出现性能问题。
如果你真的相信(并且可能有一些数字来支持它),你所处理的数据大小实际上会对你的系统征税。这些是你应该采取的步骤:
值得注意的是,1和2一起应该能够(在大多数情况下)使用数十亿行的表格。
您应该阅读:http://www.flounder.com/optimization.htm。特别是最后一行:
优化仅在重要时才有意义。重要的是,这很重要,但在你知道这很重要之前,不要浪费很多时间去做。即使你知道这很重要,你也需要知道它的重要性。如果没有性能数据,您将不知道要优化什么,并且您可能会优化错误的东西。
结果将是模糊的,难以编写,难以调试,并且难以维护无法解决问题的代码。因此,它具有以下双重缺点:(a)增加软件开发和软件维护成本,以及(b)根本没有性能影响。