Хорошо, с вопросом, как быть, если зольдат может быть поставлен в десант, а может быть оставлен на базе, разобрались. Корявенько, но.
А вот теперь попробуем чуть иначе поставить задачу.
Снова у нас есть Base, таблица икскомовских баз.
Снова у нас есть LandingCraft, таблица десантных транспортов с FK из неё на Base.
Снова у нас есть Trooper, который должен быть приписан к базе, и при этом может быть или не быть поставлен в десант на определённый транспорт.
Но теперь предположим, что у нас есть ещё BaseStation, таблица боевых постов на самой базе, из неё, разумеется, тоже есть FK на Base.
И пусть зольдат не так, что, как в прошлой постановке, может быть приписан к десанту, а может не приписан. Пусть у него будет ненулябельная обязанность на случай десанта и ненулябельная обязанность на случай вторжения. То есть у Trooper есть FK на LandingCraft и FK на BaseStation.
И вот как можно (если можно) на уровне структуры БД (не констрейнтов и тем более не бизнес-логики приложения) избежать ситуации, когда один зольдат ссылается на десантный корабль одной базы и боевой пост другой базы? В голову ничего не приходит. Так или иначе, зольдат имеет два транзитивных отношения к базе, которые чисто теоретически могут не соответствовать одно другому.
Инвертировать отношение к базе тоже нельзя: если мы сделаем, чтобы, наоборот, зольдат ссылался на базу, а таблица крафтов и таблица постов брали свою приписку к базе из зольдата, мы всё равно напоремся на ситуацию, когда у одного объекта больше одного отношения к базе, только теперь в другую сторону: на уровне структуры БД тогда ничего не мешает в один десант вбякать зольдат с разных баз.
Даже не вполне понимаю, какая нормальная форма тут могла бы помочь, если бы могла (возможно, как раз потому что выше третьей без шпаргалки не знаю).
Продолжая страдать на тему избыточности
17 ноября 202217 ноя 2022
1 мин