2015-05-07 7 views
0

У меня есть вопрос, что я не нашел для него ответа.Вычисленный столбец Postgresql

Вот пример:

Таблица: интересы

  • ID: целочисленные - ключ
  • первичное имя: имя интерес - уникальные
  • популярность: интерес популярность

Таблица : пользователи

  • ID: целое - первичный ключ
  • электронная почта: строка - уникальный
  • интересов: массив целочисленных - внешние ключи таблицы «интересов»

Я хочу, чтобы столбец «популярность» из «интересов таблицу, которая будет вычисляться благодаря таблице «users».

Таблица пользователей

id | email   | interests 
    0 | toto0.gmail.com | [ 0 ] 
    1 | toto1.gmail.com | [ 0, 1 ] 
    2 | toto2.gmail.com | [ 1 ] 
    3 | toto2.gmail.com | [ 2 ] 

Таблица интересы

id | name   | popularity 
    0 | 'interest 0' | 2 
    1 | 'interest 1' | 2 
    2 | 'interest 2' | 1 
    3 | 'interest 3' | 0 

Я попытался это:

UPDATE interests SET popularity = (SELECT COUNT(*) from public.users where ARRAY[interests] @> ARRAY[interests.id]); 

Но я не хочу, чтобы выполнить запрос на обновление таблицы интересов. Я хочу сказать, что я хочу, чтобы столбец «популярность» автоматически заполнялся, когда пользователь подписывается на него.

Если я создаю «представление», как это, он должен работать так, как я хочу?

CREATE VIEW interests_popularity (id, popularity) AS 
    SELECT COUNT(1) as popularity, interest.id 
    FROM public.user, interest 
    WHERE ARRAY[public.user.interests] @> ARRAY[interest.id] 
    GROUP BY interest.id; 

Есть ли более эффективный способ сделать это?

ответ

0

Я изменил свою модель для решения этой проблемы.

Существует разделенный стол, и когда мне нужно получить интерес по популярности, мне просто нужно рассчитывать на ключ «УНИКАЛЬНЫЙ».

0

Предложение Константина состояло в том, чтобы использовать триггер, чтобы увеличить популярность в таблице «интересы» каждый раз, когда пользователь подписывается на определенный интерес. Это может быть достаточно эффективным, пока слишком много сеансов не ожидают блокировки на уровне строк с особым интересом, который обновляется несколькими сеансами.

Если вы отбросили ограничение уникальности в таблице «интересы», вы можете записывать новые подписки «на лету» со вставкой, которая ничего не блокирует. Чтобы получить общую статистику, вам нужно будет сделать SELECT id, count(*) FROM interests GROUP BY id, что может быть достаточно быстрым для вас, если вы периодически обновляете всю таблицу, чтобы перегруппировать ее, чтобы исключить дубликаты.

+0

Я думаю, что я буду использовать задание cron для вычисления таблицы «interesets» один или два раза в день –