powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Юзеры - Друзья. Какая связь?
25 сообщений из 50, страница 2 из 2
Юзеры - Друзья. Какая связь?
    #35302872
Фотография man.without.face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чёрт... я начинаю запутываться. О_о
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35302978
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Сергей Васкецов

Вот интересная у Вас ситуация получается.
Все связи оказываются однонаправленными.
Действительно в некотором виде это можно и так рассматривать.

А вот возьмем например половых партнеров. Будем вести базу тех, кто с кем спал.
Не получится ли так, что я .. с этой девушкой имел связь а она об этом .. не знает?...

Если вы будете настаивать на том что можно юзеров поделить по половому признаку,
типа - трахавшие и трахнутые... то ... как быть с голубыми.
Вобщем контрпримеров много можно привести.

Вывод - шаблоны хорошо, но подход должен быть индивидуальным.
Типа советую еще раз подумать))))
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35302990
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче - графы бывают как ориентированные, так и неориентированные. И, возможно, смешанные. Типа это азбука. Определитесь с типом графа, и все станет на свои места.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35302998
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanНе получится ли так, что я .. с этой девушкой имел связь а она об этом .. не знает?...
Вы путаете наличие связи и ее трактовку. В приципе, и процитированное в жизни может быть.

gardenmanможно юзеров поделить по половому признаку
Это еще тут зачем?

gardenmanВобщем контрпримеров много можно привести
Вы готовы привести хотя бы один приличный контрпример, когда связь, которая не может быть однонаправленной, обязательно хранить в БД как двунаправленную? Буквально так.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35302999
Фотография man.without.face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да мне вот нужно как раз таки разобраться с друзьями. и как организовать эти связи
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303003
Фотография man.without.face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чуть запоздал. сорри.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303010
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanВсе связи оказываются однонаправленными
В БД - да. Размножить запись и сделать "встречную" можно всегда. Обратное неверно.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303093
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Васкецов
gardenmanВобщем контрпримеров много можно привести
Вы готовы привести хотя бы один приличный контрпример, когда связь, которая не может быть однонаправленной, обязательно хранить в БД как двунаправленную? Буквально так.

Пример:
Сидели за одной партой....
Ели из одной тарелки....

конечно можно ввести такую таблицу как "Тарелки" или "Парты")).. но мы ведь до этого маразма не дойдем, правда?

Друг - это такая личность которая знает что он друг и согласен с этим своим статусом и причем обратное тоже верно) такая вот дружба бывает. Правда редко.

Впрочем мысль... Если два FOREIGN KEY настроить на PRIMARY KEY, таким образом чтобы дважды нельзя было ввести пару | 0001 | 0002 |? Т.е. если | 0001 | 0002 | есть , то | 0002 | 0001 | уже получает отлуп)))

Подумайте, прикольно ведь...
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303252
Фотография man.without.face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanПодумайте, прикольно ведь...
ну в принципе да...
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303303
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
man.without.face gardenmanПодумайте, прикольно ведь...
ну в принципе да...

Попробовал. Не получается.) Ну да ладно...~~~
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303309
Фотография man.without.face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman man.without.face gardenmanПодумайте, прикольно ведь...
ну в принципе да...

Попробовал. Не получается.) Ну да ладно...~~~

Блин. Это фигово. Так и придётся что ли дважды ввести пару | 0001 | 0002 |....
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303345
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
man.without.face gardenman man.without.face gardenmanПодумайте, прикольно ведь...
ну в принципе да...

Попробовал. Не получается.) Ну да ладно...~~~

Блин. Это фигово. Так и придётся что ли дважды ввести пару | 0001 | 0002 |....
Повесь триггер. Пусть проверяет.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303347
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или триггер AFTER INSERT путь добавляет симметричную пару.
А также триггер AFTER DELETE пусть удаляет что нужно)
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303351
Фотография man.without.face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да это можно и руками....
хотя триггер будет работать на уровне базы, поэтому собственно произодительность должна быть выше.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303647
Hryuckinnen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решили социальную сеть написать? Надо было начинать год назад, сейчас были бы на коне.
Есть вариант проще, без симметричных пар.
1. Когда юзер 1 посылает юзеру 2 предложение дружить, оно повисает в специальной табличке wannabe_friends в виде |1|2|.
2. Если юзер 2 принимает предложение юзера 1, точно такая же запись создаётся в таблице friends, а если нет, значит, нет. В любом случае, запись из wannabe_friends удаляется.
3. Вместо этого юзер 2 может послать юзеру 1 встречное предложение. Перед тем, как помещать в wannabe_friends запись |1|2|, надо проверить, нет ли там уже записи |2|1|. Если она есть, такую же запись |2|1| надо создать в friends, а из wannabe_friends сбросить.

Как получить всех друзей юзера?
Код: plaintext
1.
2.
3.
SELECT friend_id FROM friends WHERE user_id  = @user_id
UNION
SELECT user_id FROM friends WHERE friend_id  = @user_id

Как получить всех друзей друзей юзера?
Код: plaintext
1.
2.
3.
SELECT friend_id FROM friends WHERE user_id IN (... тут предыдущий запрос ...)
UNION
SELECT user_id FROM friends WHERE friend_id IN (... тут предыдущий запрос ...)

Как получить всех друзей друзей друзей юзера?
Код: plaintext
1.
2.
3.
SELECT friend_id FROM friends WHERE user_id IN (... тут предыдущий запрос ...)
UNION
SELECT user_id FROM friends WHERE friend_id IN (... тут предыдущий запрос ...)

Т.е. фактически так же. Можно написать рекурсивную хранимку, которая вызывает сама себя столько раз, сколько уровней друзей нужно найти, а на самом глубоком уровне выполняет первый из показанных запросов.

ЗЫ: В этой модели ничто не мешает юзеру дружить с самим собой. Хотя программный код (не SQL), который будет рекурсивно обходить список друзей юзера, может от этого и вывалиться.

ЗЫЗЫ: Я не профессиональный SQLщик, просто балуюсь. Все советы предоставлены AS IS, без каких-либо гарантий, даже без подразумеваемой гарантии того, что предоставленные запросы будут работать и что-либо делать. Я снимаю с себя всякую ответственность за любой ущерб, причинённый кому-либо в результате следования предоставленным советам. Читая даный пост, Вы автоматически принимаете условия данного лицензионного соглашения.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303648
Hryuckinnen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫЗЫЗЫ: Пункт 3 следует читать так:
3. Вместо этого юзер 2 может послать юзеру 1 встречное предложение. Перед тем, как помещать в wannabe_friends запись |1|2|, надо проверить, нет ли там уже записи |2|1|. Если она есть, запись |1|2| в wannabe_friends создавать не надо. Вместо этого запись |2|1| надо создать в friends, а из wannabe_friends сбросить.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35303667
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно. Не мучтесь. В правильном решении должно быть три таблицы.
1) Люди
2) Дружбы
3) Связи между дружбами и людьми


Код: plaintext
1.
2.
3.
4.
5.
create table person (
    person_id int not null,
    primary key (person_id),
    ...
)

Код: plaintext
1.
2.
3.
4.
5.
create table friendship (
    friendship_id int not null,
    primary key (friendship_id),
    ...
)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create table friendship_person_xref (
    person_id not null,
    friendship_id int not null,
    primary key (friendship_id,person_id), -- чтобы дружба могла заводиться тока один раз и не было дубликатов
    foreign key на person,
    foreign key на friendship
    ...
)

В такой струтуре можно дружить не только по двое, но и одномуЮ и по три , ит.д)

На самом деле это паттерн. Прсто надо знать как такое делается.
Есть еще задачи аналогичные этой.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35304273
Фотография man.without.face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HryuckinnenРешили социальную сеть написать? Надо было начинать год назад, сейчас были бы на коне.

Решили. :) Только аналогов не имеет ни одна социальная сеть. ;)
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35304279
Фотография man.without.face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanНа самом деле это паттерн. Прсто надо знать как такое делается.
Есть еще задачи аналогичные этой.

Я не проектировщик или не БДшник, поэтому паттернов, о которых вы говорите - не знаю. Я программист, просто надо...

Спасибо вам, gardenman , большое.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35308927
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanПример:
Сидели за одной партой....
Ели из одной тарелки....
Ошибаетесь. Некто А утверждает, что "мы сидели с Б за одной партой". В свою очередь Б утверждает, что "мы не сидели с А за одной партой". Оба имеют право на подобные высказывания. Связи - суть высказывания, у них есть автор. Вы же фактически утверждаете, что отношение лиц, участвующих в связи, к этой связи может быть только одинаковым, что неверно.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35308934
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanЛадно. Не мучтесь. В правильном решении должно быть три таблицы
Это уже клуб по интересам, а не дружба.
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35310125
Фотография BrigadeFuhrer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут вожможно 2 вида связи
1. Друзья пользователя не тоже самое что и в "друзьях у" по аналогии с ЖЖ
2. Друзья пользователя - тоже самое что и в "друзьях у" по аналогии с "одноклассниками"

1. USER_ID | FRIEND_ID

2. USER_ID1 | USER_ID2 столбцы равнозначны, тоесть
1110001 | 1110002 то же что и
1110002 | 1110001
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35452968
Фотография man.without.face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так какое решение правильное? =)
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35458866
Фотография GamePro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто то сказал завести отдельную таблицу.. Вы что с ума сошли? этож очень долго и нудно.. нет я бы так не сделал.. Вот вы совет дали!
...
Рейтинг: 0 / 0
Юзеры - Друзья. Какая связь?
    #35458873
Фотография man.without.face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я сделал в итоге так:

=======================================
friends - список друзей пользователя.
----------------------------------------------------------------------
ID - ...
userID - сам пользователь (ID)
friendID - ID друга.

=======================================
friends_flags - пользователи, ещё не подтвердившие
дружбу, сначала попадают в эту таблицу.
----------------------------------------------------------------------
ID - ...
userID - сам пользователь (ID)
friendID - ID друга.
flag - если false, то пользователь ещё не подтвердил
дружбу. если true, то пользователь удаляется из
данной таблицы и попадает в таблицу friends, как
друг.
=======================================
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 2 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Юзеры - Друзья. Какая связь?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]