#sql #postgresql
Вопрос:
Есть channel
, user
, и channel_to_user
.
В основном channel_to_user поддерживает связь «есть» между user
и channel
.
Однако мне нужно, чтобы каналы были уникальными в наборе их пользователей.
Например, если в канале X есть пользователи A и B, не может быть канала Y, в котором есть пользователи A и B.
Однако может существовать канал Z, в котором есть пользователи A, B и C.
Я думал о двух решениях:
- спусковой крючок
- столбец с массивом отсортированных идентификаторов пользователей, который был бы уникальным
Есть ли что-нибудь более элегантное? Я использую postgres
.
Комментарии:
1. Можете ли вы объяснить, зачем вам это нужно для существования? Это кажется странным условием и может привести к некоторым интересным проблемам в будущем…
2. У меня возникли проблемы с пониманием структуры вашей таблицы, некоторые примеры данных могли бы помочь. Если у вас еще нет идентификатора канала, как вы можете определить, какие группы пользователей находятся на данном канале?
3. Массив звучит разумно для такой необычной ситуации, как эта. Я бы не стал считать это строкой таблицы бестактности: канал (1); пользователи {U4, U12, U15, U23}.
Ответ №1:
Уникальное ограничение на столбец с массивом отсортированных идентификаторов пользователей по каналам звучит неплохо. Вы можете создать функцию триггера перед вставкой или обновлением в этой таблице, чтобы автоматически упорядочить элементы этого массива :
CREATE OR REPLACE FUNCTION your_function() RETURNS trigger AS $ BEGIN NEW.user_id_array = SELECT array(SELECT unnest (NEW.user_id_array) AS id ORDER BY id) RETURN NEW ; END ; $ ; CREATE TRIGGER function_trigger BEFORE INSERT OF UPDATE ON your_table FOR EACH ROW EXECUTE FUNCTION your_function() ;