У меня проблема с дизайном базы данных, которую я исследовал некоторое время, но не могу найти правильного ответа. Допустим, у нас есть две таблицы house_schema
и house
, как показано ниже:
house_schema {
id big int,
house_height int,
house_width int,
house_decoration vchar(1024),
build_date timestamp,
primary key id,
}
house {
id big int,
owner vchar(255),
price big int,
house_schema_id big int,
primary key id,
foreign key fk_house_house_schema_id (`house_schema_id`) reference `house_schema`.`id`
}
В таблице house_schema
хранятся некоторые физические атрибуты house
. В пользовательском интерфейсе программного обеспечения пользователи выбирают схему, затем нажимают кнопку «построить». Дом построен и хранится в house
. Есть еще несколько таблиц, например house_schema
, чтобы описать, как следует строить дом.
В простом дизайне внешний ключ, похоже, работает хорошо. Однако возникает проблема, когда разработчик решает удалить схему, которая, по его мнению, устарела. Уже есть несколько домов, построенных из схемы, и внешний ключ предотвращает ее удаление. Если мы изменим внешний ключ на DELETE ON CASCADE
, то эти дома потеряют информацию, из которой они были построены.
Какой шаблон проектирования лучше всего подходит для решения этой проблемы? Что я могу представить, так это иметь дублирующуюся таблицу house_schema
. После того, как дом будет построен, скопируйте строку в house_schema
в дублирующую таблицу.
Но это приводит к множеству повторяющихся таблиц в базе данных, поскольку у меня есть несколько похожих таблиц с house_schema
. Похоже, это нарушает правила нормализации базы данных.
У кого-нибудь есть хорошая идея?