создать базу данных для каждого экземпляра модели Django - PullRequest
0 голосов
/ 26 июля 2011

У меня есть одна «мастер-модель» с множеством «детских моделей»: Поскольку я знаю, что будет много данных (через дочерние элементы), я хотел бы динамически хранить каждый новый экземпляр этого 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. динамически обновлять настройки. Словарь для добавления новой базы данных: '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

Я на правильном пути?

1 Ответ

0 голосов
/ 26 июля 2011

Это звучит как массовый случай преждевременной оптимизации? Подумай о том, что ты делаешь. Вы настраиваете систему с огромным количеством движущихся частей с вероятными условиями гонки, которые сложны и сложны в обслуживании. Все это еще до того, как вы увидели данные, приведет к проблемам с производительностью.

Если вы действительно убеждены (и, может быть, у вас есть какие-то цифры, подтверждающие это), что размер данных, с которыми вы имеете дело, действительно будет обременять вашу систему. Вот шаги, которые вы должны предпринять:

  1. Лучшее оборудование. Аппаратное обеспечение намного дешевле, чем время разработчиков.
  2. Разметка
  3. Правильно выполненный шардинг (то, что вы предлагаете, вряд ли является правильным подходом шардинга)

Важно отметить, что 1 и 2 вместе должны (в большинстве случаев) получить доступ к таблицам с миллиардами строк.

Вы должны прочитать на: http://www.flounder.com/optimization.htm. В частности, последние строки:

Оптимизация имеет значение только тогда, когда она имеет значение. Когда это важно, это имеет большое значение, но пока вы не знаете, что это важно, не тратьте много времени на это. Даже если вы знаете, что это важно, вам нужно знать, где это важно. Без данных о производительности вы не будете знать, что оптимизировать, и, вероятно, оптимизируете не то.

Результат будет неясным, трудным для написания, трудным для отладки и трудным в обслуживании кода, который не решит вашу проблему. Таким образом, он имеет двойной недостаток: (а) увеличение затрат на разработку и обслуживание программного обеспечения и (б) отсутствие какого-либо влияния на производительность.

...