Удаление родительской записи в PostgreSQL при удалении дочерней в случае наличия внешнего ключа из родительской записи к дочерней
Друзья, всем привет. Столкнулись на работе с задачей, которую никак не получается решить. Стало очевидно, что простого решения не найти, поэтому решили спросить совета более опытных людей на форуме.
У нас имеется БД PostgreSQL и мы работаем с ней с помощью python фреймворка SqlAlchemy, используя его ORM
У нас есть сущность, которую можно представить в виде:
{
uuid: UUID
data: {
property_1: {
value: str
}
property_2: {
value: str
}
property_3: {
value: str
}
}
}
или как несколько вложенных сущностей
Main
{
uuid: UUID
data: Data
}
Data
{
property_1: Property
property_2: Property
property_3: Property
}
Property
{
value: str
}
- У нас имеются три таблицы, которые позволяют хранить такую сущность
main_table
{
id: int
uuid: UUID
}
data_table
{
id: int
main_id: int = ForeignKey (main_table.id)
property_1_id: ForeignKey (property_table.id)
property_2_id: ForeignKey (property_table.id)
property_3_id: ForeignKey (property_table.id)
}
property_table
{
id: int
value: str
}
Видно, что вторая таблица содержит несколько колонок одного и того же типа (Property)
Получается такая связь по внешним ключам между таблицами:
main_table <--- data_table ---> property_table
Если отравить сущность в базу, то она корректно разложится по таблицам, при чтении все также корректно собирается из таблиц в один объект.
НО есть проблема с удалением! Для ForeignKey в data_table установлено ON DELETE CASCADE, поэтому когда мы удаляем запись а main_table, то автоматически удаляется и запись в data_table, а записи в property_table остаются висеть мусором, потому что не они ссылаются на запись в data_table, а наоборот, поэтому тут каскадное удаление не работает.
Вопрос. С виду это достаточно типовая задача, но мы еще с таким не сталкивались. Прошу подсказать подход или подходы в решении. Нам необходимо иметь возможность удалять всю сущность, то есть записи во всех таблицах, связанных с сущностью. Другими словами, чтобы при удалении записи в main_table удалялись все записи, связанные с ней из таблиц data и property
Заранее спасибо!