Size: a a a

DBA - русскоговорящее сообщество

2021 March 18

P

PavelDmitrenko in DBA - русскоговорящее сообщество
George
Таблица выглядит вот так. Собственно:
id - id самой записи
entity_id - id в нашей системе. То самое поле, из-за которого вопрос, каким образом его можно привязать к реальным сущностям в других таблицах, особенно в случае удаления этой сущности или удаления этой записи о сущности: триггером с какой-то процедурой перебора по тайпам, какой-то виртуальной таблицей/колонкой, хз.
entity_type - enum (пока что), что это именно: проект, таска, лог, журнал, запись, etc.
external_provider - enum (пока что), т.к. пока что поддерживаем ограниченное количество связываемых систем, обозначающий скорее общее название сервиса, т.к. мы работаем в том числе с self-hosted решениями и обслуживаем сразу нескольких. В этом случае провайдер будет один, а сурс будет отличаться
external_source - url, важно в случае self-hosted вариантов чужих систем
external_additional_data - понятно.
Рассмотрите вариант с наследованием таблиц
В корневой таблице — провайдере идентификаторов — сиквенс, всё остальные внешние наследуются от неё, с any_external_entities FK на корневую.
источник
2021 March 19

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
George
Таблица выглядит вот так. Собственно:
id - id самой записи
entity_id - id в нашей системе. То самое поле, из-за которого вопрос, каким образом его можно привязать к реальным сущностям в других таблицах, особенно в случае удаления этой сущности или удаления этой записи о сущности: триггером с какой-то процедурой перебора по тайпам, какой-то виртуальной таблицей/колонкой, хз.
entity_type - enum (пока что), что это именно: проект, таска, лог, журнал, запись, etc.
external_provider - enum (пока что), т.к. пока что поддерживаем ограниченное количество связываемых систем, обозначающий скорее общее название сервиса, т.к. мы работаем в том числе с self-hosted решениями и обслуживаем сразу нескольких. В этом случае провайдер будет один, а сурс будет отличаться
external_source - url, важно в случае self-hosted вариантов чужих систем
external_additional_data - понятно.
Я опять нифига не понял...

Это что, вопрос про то, как сделать внешний ключ по составному первичному ключу?
источник

P

PavelDmitrenko in DBA - русскоговорящее сообщество
Ilia Zviagin
Я опять нифига не понял...

Это что, вопрос про то, как сделать внешний ключ по составному первичному ключу?
Я так понял, что про FK на несколько таблиц
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
PavelDmitrenko
Я так понял, что про FK на несколько таблиц
Это как? Такого не бывает
источник

P

PavelDmitrenko in DBA - русскоговорящее сообщество
Ilia Zviagin
Это как? Такого не бывает
Есть потребность, дело обычное. Можно реализовать аналог FK самостоятельно через триггеры, а можно использовать функционал, имеющийся в постгрес - наследование таблиц, и на основе этого сделать полноценный FK. В Оракле можно в FK ссылаться на отображение, там можно было бы попробовать так (юнионом соединить требуемые таблицы, но там много ограничений, не буду утверждать, что будет полноценный FK с каскадами и проч).
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
PavelDmitrenko
Есть потребность, дело обычное. Можно реализовать аналог FK самостоятельно через триггеры, а можно использовать функционал, имеющийся в постгрес - наследование таблиц, и на основе этого сделать полноценный FK. В Оракле можно в FK ссылаться на отображение, там можно было бы попробовать так (юнионом соединить требуемые таблицы, но там много ограничений, не буду утверждать, что будет полноценный FK с каскадами и проч).
Такого не бывает.
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
PavelDmitrenko
Есть потребность, дело обычное. Можно реализовать аналог FK самостоятельно через триггеры, а можно использовать функционал, имеющийся в постгрес - наследование таблиц, и на основе этого сделать полноценный FK. В Оракле можно в FK ссылаться на отображение, там можно было бы попробовать так (юнионом соединить требуемые таблицы, но там много ограничений, не буду утверждать, что будет полноценный FK с каскадами и проч).
Если таблица ссылается на две таблицы, она ссылается на одну, которая, в свою очередь, ссылается на другую.
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
PavelDmitrenko
Есть потребность, дело обычное. Можно реализовать аналог FK самостоятельно через триггеры, а можно использовать функционал, имеющийся в постгрес - наследование таблиц, и на основе этого сделать полноценный FK. В Оракле можно в FK ссылаться на отображение, там можно было бы попробовать так (юнионом соединить требуемые таблицы, но там много ограничений, не буду утверждать, что будет полноценный FK с каскадами и проч).
Если на три таблицы - аналогично, только в цепочке три таблицы
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
И так далее
источник

P

PavelDmitrenko in DBA - русскоговорящее сообщество
Ilia Zviagin
Если таблица ссылается на две таблицы, она ссылается на одну, которая, в свою очередь, ссылается на другую.
В случае использования подхода с наследованием, FK ссылается на одну таблицу, являющуюся родителем дочерних, которые наследуются от неё
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
PavelDmitrenko
В случае использования подхода с наследованием, FK ссылается на одну таблицу, являющуюся родителем дочерних, которые наследуются от неё
Ну, да
источник

YS

Yaroslav Schekin in DBA - русскоговорящее сообщество
PavelDmitrenko
Есть потребность, дело обычное. Можно реализовать аналог FK самостоятельно через триггеры, а можно использовать функционал, имеющийся в постгрес - наследование таблиц, и на основе этого сделать полноценный FK. В Оракле можно в FK ссылаться на отображение, там можно было бы попробовать так (юнионом соединить требуемые таблицы, но там много ограничений, не буду утверждать, что будет полноценный FK с каскадами и проч).
> а можно использовать функционал, имеющийся в постгрес - наследование таблиц, и на основе этого сделать полноценный FK.

Нет, нельзя. https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_table_inheritance написано не просто так.
источник

P

PavelDmitrenko in DBA - русскоговорящее сообщество
Yaroslav Schekin
> а можно использовать функционал, имеющийся в постгрес - наследование таблиц, и на основе этого сделать полноценный FK.

Нет, нельзя. https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don.27t_use_table_inheritance написано не просто так.
Я не увидел причин, делающих использование наследования для данной задачи невозможным.
источник

YS

Yaroslav Schekin in DBA - русскоговорящее сообщество
PavelDmitrenko
Я не увидел причин, делающих использование наследования для данной задачи невозможным.
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
PavelDmitrenko
Я не увидел причин, делающих использование наследования для данной задачи невозможным.
Ярослав же не об этом, а о том, что наследование PG вообще нигде не следует применять.
источник

P

PavelDmitrenko in DBA - русскоговорящее сообщество
Ilia Zviagin
Ярослав же не об этом, а о том, что наследование PG вообще нигде не следует применять.
Не-не, он не только про это (но и про это тоже, да), но и про то, что есть, скажем так, нюансы в логике работы связки FK + наследованный таблицы.
С этим согласен, нюансов с наследованием много.
источник

V

Vladislav in DBA - русскоговорящее сообщество
Привет, вопрос по PostgreSQL, у меня было таблица на проде в который было 180млн записей, после отчистки этой таблицы, запросы в нее выполняются очень медленно, может знаете в чем дело?
источник

PA

Pavel Artyomenko in DBA - русскоговорящее сообщество
Статистика не обновилась, плюс, возможно, она ещё не вакуумизировалась
источник

PA

Pavel Artyomenko in DBA - русскоговорящее сообщество
Т.е. удаленные записи все ещё в ней лежат, помеченные КП как удаленные
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Vladislav
Привет, вопрос по PostgreSQL, у меня было таблица на проде в который было 180млн записей, после отчистки этой таблицы, запросы в нее выполняются очень медленно, может знаете в чем дело?
Смотри план запроса, он скажет.
источник