Стоит ли иметь мета-промежуточную модель сравнения для Django? - PullRequest
2 голосов
/ 03 мая 2020

Я новичок в Django и хочу знать, как лучше структурировать мои модели.

У меня есть модель Computer с полями screen_size, price, company, et c .. и в конечном итоге захотим иметь пользовательский интерфейс, который может сравниваться с другими Computer экземплярами.

Так, например, если мы посмотрим на ComputerA, пользовательский интерфейс отобразит все остальные Computer экземпляры и сравнить цену, размер экрана и компанию относительно ComputerA

Интересно, стоит ли иметь промежуточную модель ComputerComparison, которая имеет два внешних ключа, которые ссылаются на оба Computer экземпляров, которые я пытаюсь сравнить?

1 Ответ

0 голосов
/ 03 мая 2020

Модель используется для хранения вещей (в базе данных). Сравнение между двумя предметами обычно стоит , а не . Прежде всего это приведет к масштабированию квадратичных c: если у вас есть 100 Computer объектов, то будет 9'990 возможных сравнений, если число Computer с удваивается, то общее число сравнений примерно равно four .

Но, вероятно, более серьезным является тот факт, что вы вводите дублирование данных . Скорее всего, вы будете хранить (части) одни и те же данные дважды или более в базе данных. Проблема с дублированием данных состоит в том, что оказывается, что трудно хранить эти дубликаты в syn c. Представьте, что вы, например, изменили price одного из Computer объектов, а затем необходимо обновить также объекты ComputerComparison, на которые ссылается этот компьютер. Хотя это может показаться простой задачей, это означает, что все создания, обновления, удаления и, вероятно, из нескольких полей должны быть приняты во внимание. Синхронизация данных даже в одной и той же базе данных является сложной проблемой, поэтому ее лучше избегать.

Но в любом случае вам, скорее всего, не нужно хранить сравнения вообще. Обычно это делается с помощью представления. Представление, которое, например, дает два первичных ключа для сравнения двух элементов:

def compare(request, pk1, pk2):
    c1 = get_object_or_404(Computer, pk=pk1)
    c2 = get_object_or_404(Computer, pk=pk2)
    # … compare c1 and c2 …
    return render(request, 'some_template.html', {'some_vars': some_vals})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...