Я пытаюсь создать очень простую таблицу, в которой хранятся данные друзей в сообществе.Избегайте избыточности данных в таблице друзей
поэтому я хранил userId
из 2 друзей соответственно.
Гола
Пользователь хочет, чтобы загрузить его/ее список друзей.
t_friends Вариант 1:
Запрос
SELECT * FROM t_friend WHRE user_id = 10
10
является текущим userId
пользователя, который ищет свой список друзей, и он имеет 1 друга userId(20)
Этот способ userId (10)
находит своего друга (20)
НО что, если userId(20)
искали друзей? Запрос связан с userId
.
Это подводит меня к другой конструкции, который содержит избыточные данные:
t_friends вариант 2:
userId (10)
нагрузки в настоящее время:
SELECT * FROM t_friend WHRE user_id=10
похож на этот запрос для userId(20)
будет:
SELECT * FROM t_friend WHRE user_id=20
А как насчет избыточности? Это приводит меня тогда к этому запросу, используя вариант дизайна таблицы 1:
SELECT * FROM t_friend WHERE user_id=10 OR friend_id=10
У меня есть ощущение, что есть более разумный способ решить это. Есть ли у вас опыт в этой структуре?
Благодаря
насчет избыточности? То, что вы сделали, прекрасно, и нет более разумного способа, независимо от того, что кто-нибудь напишет об этом. Вы запрашиваете друзей пользователя. Ваши данные нормализованы, и все просто отлично. Если вы можете добиться чего-либо, пытаясь «оптимизировать», это разрушает все это, создавая ненужные сложные запросы и делая систему, которую трудно поддерживать. Независимо от того, кто или какой опыт у них есть с SQL, когда люди видят созданную вами таблицу - все имеет смысл на первый взгляд. TL; DR: ничего не меняйте. – Mjh
Спасибо @Mjh. но таким образом мы имеем вдвое больше данных. Вместо того, чтобы иметь, например, 10 ГБ, у вас будет 20 ГБ для сканирования и т. Д. –
@bub Окончательный запрос, который вы использовали, совершенно прекрасен, и мне кажется, что проблема слишком задумана. Одна строка для каждой связи использует запрос OR. Вы можете использовать IF, чтобы избежать этого в php: 'SELECT IF (user_id = 10, friend_id, user_id) AS target_id FROM t_friend WHERE user_id = 10 ИЛИ friend_id = 10' –