DB Trigger для ограничения максимального размера таблицы в Postgres - PullRequest
3 голосов
/ 31 июля 2011

Возможно ли, возможно, использование DB-триггеров для установки максимального размера таблицы в БД postgres?

Например, скажем, у меня есть таблица с именем: Comments.

С точки зрения пользователя, это можно делать как можно чаще, но, скажем, я хочу сохранить только 100 самых последних комментариев в БД.Поэтому я хочу иметь триггер, который автоматически поддерживает это.Т.е. при наличии более 100 комментариев удаляются самые старые и т. Д.

Может ли кто-нибудь помочь мне с написанием такого триггера?

Ответы [ 3 ]

2 голосов
/ 31 июля 2011

Я думаю, что триггер - не тот инструмент для работы; хотя это возможно реализовать. Кое-что о порождении «удаления» из исполняющей вставки заставляет волосы на моей шее шею встать. Таким образом вы создадите много блокировок и, возможно, конфликтов; и вставки обычно не должны генерировать блокировки.

Для меня это говорит о «хранимой процедуре».

Но я также думаю, что вы должны спросить себя, "зачем удалять" старые комментарии? Удаляет анафему. Лучше просто ограничить их при отображении. Если вы действительно беспокоитесь о размере таблицы, используйте столбец TEXT. Postgres будет хранить их в теневой таблице, и при полном сканировании исходной таблицы все будет прекрасно.

1 голос
/ 31 июля 2011

Ограничить до 100 комментариев на пользователя довольно просто, например

delete from comments where user_id = new.user_id
order by comment_date desc offset 100;

Ограничить размер байта сложнее. Вам нужно будет рассчитать соответствующие размеры строк, которые не будут учитывать размеры индексов, мертвые строки и т. Д. В лучшем случае вы использовали бы функции администратора для получения размера таблицы, но они не приведут к размеру для пользователя, только общий размер.

0 голосов
/ 13 марта 2017

Теоретически мы можем создать таблицу из 100 фиктивных записей, а затем просто перезаписать их реальными комментариями. Как только мы пройдем 100-е, мы перезапишем 1-е и т. Д.

Таким образом, мы предполагаем, что размер таблицы будет одинаковым, но это невозможно, поскольку обновление эквивалентно удалению, вставив в Postgresql. Таким образом, размер таблицы будет продолжать расти.

Таким образом, если цель не состоит в том, чтобы переполнить дисковод, то после того, как диск заполнен на 80%, необходимо выполнить «полный вакуум», чтобы освободить место на диске. «Вакуум заполнен» сам по себе требует места на диске. Если вы сохранили записи с фиксированным номером, то возникнет эффект вакуума. Также, кажется, бывают случаи, когда вакуум может выйти из строя .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...