Структура SQL для уникального группового чата

#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() ;