Я использую Postgres.
Имея чат-бота, мне нужно создать таблицу для хранения матчей:
A в паре с B и, следовательно, B в паре с A.
Я думал о том, чтобы создать таблицу типа:
CREATE TABLE matches (user_a INT, user_b INT);
И сохранить пару раз как:
INSERT INTO matches (1, 2);
Или дважды как:
INSERT INTO matches (1, 2);
INSERT INTO matches (2, 1);
Мне нужно будет запросить таблицу также только с одним столбцом, чтобы проверить пользователя «1»
В первом случае мне нужно будет использовать:
SELECT * FROM matches WHERE user_a=1 or user_b=1;
Во втором случае я могу запрос только с помощью:
SELECT * FROM matches WHERE user_a=1;
Поскольку сохраняются обе стороны совпадения.
Мне также необходимо объединить эту таблицу с другой таблицей. В первом случае мне нужно сделать
SELECT * FROM users LEFT JOIN matches ON matches.user_a=users.user_id OR matches.user_b=users.user_id;
Во втором случае я могу избежать операции ИЛИ:
SELECT * FROM users LEFT JOIN matches ON matches.user_a=users.user_id;
Какой из двух подходов использования одной таблицы будет лучшая практика? Я думаю, что первый может сэкономить половину пространства, но второй может быть более нормализован и лучше для производительности.