Страницы

Поиск по вопросам

понедельник, 15 июля 2019 г.

Какую модель структуры БД выбрать, чтобы Django справился?

Задача: вести учет движения чего-нибудь. К примеру, бункеров.
Бункеры перемещаются между разными объектами Важно иметь возможность получить следующие отчеты:
А) В одной строке Объект "исходящий" и объект "назначения". В примере на картинке передвижение бункеров между морскими портами.
тут порты и корабли это объекты Б) Отчет по количеству бункеров на данный момент на каждом из объектов В) отчет по количеству объектов на каждом типе объекта (наш порт, корабль, порт заказчика)
Можно было бы использовать такой дизайн таблицы: +---------------+ | Field | +---------------+ | id | | object_out_id | | object_in_id | | qty | +---------------+ ..тогда отчет А) вытягивается из базы средствами ORM простым запросом FLow.Objects.all(), а для остальных отчетов пришлось бы использовать не самые простые SQL запросы, с которыми ORM не справится.
Второй вариант записывать одно перемещение бункера в две строки в базе. +----------------+ | Field | +----------------+ | id | | transaction_id | | object_id | | qty | +----------------+
С большинством запросов тогда справится ORM, все работает быстро, НО - отчет А) как на рисунке простым запросом не вытянуть... Хочется его сериализовать в JSON средствами Django REST Framework. RAW запросы в DRF не поддерживают пагинацию..
Посоветуйте, какую модель хранения данных выбрать, что бы не было проблем с выводом в JSON отчета А) и при больших объемах данных не было слишком долгих обработок для прочих запросов?


Ответ

Я бы сделал так... Если типы объектов известны заранее и неизменны, то в таблице Object поле type_id лучше сделать с choices. Если нет, то сойдет и таблица:
Type - типы объектов
id name
Object - объекты
id name type_id count - количество объектов на данный момент
Transaction - транзакции
id date object_id_1 object_id_2 count
При записи (изменении, удалении) транзакции увеличиваете/уменьшаете count в связаных оъектах. Все нужные Вам запросы тривиальны. (имена таблиц даны только для примера, в Django, возможно, придется использовать другие)

Комментариев нет:

Отправить комментарий