Мой вопрос связан с Дизайн базы данных для редакций? , но более сложный.
У меня есть две таблицы с отношениями «многие ко многим». Давайте назовем их А и Б.
A: A.id, A.data, A.last_change_time
B: B.id, B.data
A_B: A_B.A_id, A_B.B_id, A_B.connected_since_time, A_B.some_status_enum
Таблица соединителей A_B должна поддерживать ревизии. Если связь между элементом в A и элементом в B удалена, необходимо сохранить историческую информацию, существовавшую ранее. Если статус соединения изменяется, необходимо сохранить историческую информацию о старом статусе.
Вот некоторые отчеты, которые мне нужно сгенерировать:
- Список всех элементов в A, которые вообще не связаны с B (сейчас).
- Список всех элементов в A, которые связаны хотя бы с одним элементом в B с определенным статусом.
- Список всех пар A-B, которые когда-то были подключены, но больше не подключены.
- Список всех соединений A-B, где время последнего изменения A наступает после времени соединения.
- Количество всех подключений A-B, где время последнего изменения A - после времени подключения, сгруппированного по статусу.
Я подумал просто добавить булево поле A_B.is_current в таблицу соединений. Когда соединение удаляется, я просто устанавливаю is_current в false. При изменении статуса я устанавливаю для is_current значение false для старых записей и добавляю новую запись с новым статусом.
Ответы на подобные ранее заданные вопросы часто утверждают, что «is_current» - это плохой дизайн, и должно быть лучшее решение. Предыдущие решения говорили о пересмотре записи в одной таблице, а не об отношениях между ними.
Неправильно ли использовать столбец is_current для отслеживания истории соединений «многие ко многим»? Если это неправильно, какие проблемы это может вызвать? Какое решение лучше?