|
|
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
Мне нужно реализовать список друзей в базе данных. Как в любой социальной сети: добавляешь друга, если он тоже добавил - между вам устанавливается связь. Вроде бы все просто, вот только я не знаю в виде каких таблиц и связей это лучше сделать. Нет, ну несколько мыслей есть, но они мне не нравятся. Мысль первая. Сделать что-то типа развязки |UserID|FriendID| , где оба айдишника - внешние ключи. Проблему я тут вижу в дублируемости записей: если Юзер1 добавил Юзера2, а Юзер2 - Юзера1, то это уже две записи в таблице, хотя описывают они только одну "дружбу". Да и искать по такой таблице немного напряжно. Мысль вторая. Сделать таблицу FriendList такого типа: |UserID|Friend1ID|Friend2ID|...|Friend100ID| Тогда записей в этой таблице будет ровно столько, сколько юзеров зарегистрировано в системе - по строчке на юзера. Но тут другой минус: мы заведомо ограничиваем количество друзей каким-то константным числом (числом столбиков). Если выбрать это число маленьким, то "общительные" юзеры не смогут добавить всех друзей, а если слишком большим, то "малообщительные" юзеры будут иметь много пустого места в своих строчках этой таблицы. Возможно, есть какие-то другие варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 20:34 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
FourthLegacyПроблему я тут вижу в дублируемости записей: если Юзер1 добавил Юзера2, а Юзер2 - Юзера1, то это уже две записи в таблице, хотя описывают они только одну "дружбу". А ты так юн и наивен, что считаешь, что дружба бывает строго взаимной?.. Ню-ню... И, кстати, что тебя напрягает в поиске? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 20:49 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovИ, кстати, что тебя напрягает в поиске? Ну а как прикажешь вывести список всех взаимных друзей для одного человека? Это надо вытащить из таблицы всех, кого он добавил в друзья. А потом для каждого из добавленных им, вытащить всех их друзей и проверить, есть ли там наш юзер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 20:53 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
FourthLegacyНу а как прикажешь вывести список всех взаимных друзей для одного человека? Это надо вытащить из таблицы всех, кого он добавил в друзья. А потом для каждого из добавленных им, вытащить всех их друзей и проверить, есть ли там наш юзер. Ну а в чём сложность-то? Код: sql 1. 2. 3. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 21:02 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНу а в чём сложность-то? Код: sql 1. 2. 3. Запрос-то несложно написать (или код в моем случае, т.к. база данных объектная), но вопрос в нагрузке на базу при выполнении этого запроса. Если система высоконагруженная, то такие запросы долго жужжать будут. Что если добавить булевый флаг к записи типа isMutual ? Тогда при добавлении "дружбы" будет больше работы, но при поиске - гораздо меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 21:10 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
FourthLegacyЗапрос-то несложно написать (или код в моем случае, т.к. база данных объектная), но вопрос в нагрузке на базу при выполнении этого запроса. Если система высоконагруженная, то такие запросы долго жужжать будут. Выкинь на помойку объектную базу, поставь любую реляционную. Там есть очень полезная вещь по имени "индексы". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 21:15 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovFourthLegacyЗапрос-то несложно написать (или код в моем случае, т.к. база данных объектная), но вопрос в нагрузке на базу при выполнении этого запроса. Если система высоконагруженная, то такие запросы долго жужжать будут. Выкинь на помойку объектную базу, поставь любую реляционную. Там есть очень полезная вещь по имени "индексы". Щас. Все бросил и выбросил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 21:17 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovFourthLegacyЗапрос-то несложно написать (или код в моем случае, т.к. база данных объектная), но вопрос в нагрузке на базу при выполнении этого запроса. Если система высоконагруженная, то такие запросы долго жужжать будут. Выкинь на помойку объектную базу, поставь любую реляционную. Там есть очень полезная вещь по имени "индексы". На всякий случай напомню, что "индексы" пришли в записеориентированные базы (то есть, в "любые реляционные") именно из объектно-ориентированных, которые исторически появились раньше:) А работают и по сей день производительнее "любых реляционных":) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 21:26 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
Давайте не будем отходить от темы. Вывод какой? Использовать "Вариант номер 1" из первого поста? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 21:28 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
FourthLegacyЩас. Все бросил и выбросил. Ну продолжай отвёрткой гвозди забивать, кто ж тебе злобный буратина... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 21:49 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
Ты адекватен? Проектируется база данных под сервис, который предполагается быть высоконагруженным и иметь большое количество пользователей. Функция "дружбы" - одна маленькая функция из того множества, что должно быть реализовано. СУБД и все технические детали оговорены заранее и уже приняты. Я в первом посте не просил советов по поводу выбора платформы, мне нужен был совет именно по проектированию связей. Нет, начал тут заливать про индексы и отвертки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 21:59 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
FourthLegacyТы адекватен? Проектируется база данных под сервис, который предполагается быть высоконагруженным и иметь большое количество пользователей. Я объективен. Проектировщик базы под высоконагруженный сервис просит совета на форуме по поводу маленькой функции... Бесперспективняк. Делай как хочешь или брось монетку - хуже уже не будет. Зато не сможешь сваливать вину за провал на то, что "идиоты на глупом форуме мне неправильно подсказали". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 22:11 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
Нда, видимо мсье не слышал про такое явление, как стартап. Прошу модераторов закрыть тему, тухлая какая-то атмосфера на этом форуме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 22:12 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
Месье по крайней мере слышал про такую вещь как гугль. И знает, что понятие "стартап" немного отличается от идиотизма. Отправляйтесь лучше к коллеге didme, тот тоже проектировал что-то подобное. В его профиле найдёте четырёхсотстраничный топик, там ответы на все вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 22:33 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
> Мысль первая. Сделать что-то типа развязки |UserID|FriendID| , где оба айдишника > - внешние ключи. Проблему я тут вижу в дублируемости записей: если Юзер1 добавил > Юзера2, а Юзер2 - Юзера1, то это уже две записи в таблице, хотя описывают они > только одну "дружбу". Да и искать по такой таблице немного напряжно. отношение дружбы может (тобой) определяться как симметричное и несимметричное. Если оно несимметричное -- проблем нет вообще. Если оно симметричное -- можно хранить две записи (ничего страшного нет) -- будут проще запросы, или можно при поиске учитывать, что нужный пользователь может быть как в UserID, так и во FriendID. А можно и VIEW сделать, который это засимметрит (но это в зависимости от СУБД). > > Мысль вторая. Сделать таблицу FriendList такого типа: > |UserID|Friend1ID|Friend2ID|...|Friend100ID| Тогда записей в этой таблице будет > ровно столько, сколько юзеров зарегистрировано в системе - по строчке на юзера. Это нарушение 1НФ, смертельный приговор для БД. Делать так ни в коем случае нельзя. Итог -- мысль первая была правильная. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 22:47 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
On 06/27/2012 10:26 PM, Бредятина wrote: > На всякий случай напомню, что "индексы" пришли в записеориентированные базы (то > есть, в "любые реляционные") именно из объектно-ориентированных, которые > исторически появились раньше:) http://en.wikipedia.org/wiki/Database_management_system#History Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 22:51 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
> Запрос-то несложно написать (или код в моем случае, т.к. база данных объектная), > но вопрос в нагрузке на базу при выполнении этого запроса. Если система > высоконагруженная, то такие запросы долго жужжать будут. > > Что если добавить булевый флаг к записи типа isMutual ? Тогда при добавлении > "дружбы" будет больше работы, но при поиске - гораздо меньше. Что тебя смущает в предполагаемой производительности такого запроса ? И какой предполагается запрос ? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2012, 22:53 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
FourthLegacyНу а как прикажешь вывести список всех взаимных друзей для одного человека? Это еще что. А вот такая задачка: друзья моих друзей=мои друзья найти всех моих друзей ответ: поиск по графу с исключением повторов и циклов. У вас направленный граф, реализация - таблица перекрестных ссылок - Вариант1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 10:35 |
|
||
|
Проектирование списка друзей
|
|||
|---|---|---|---|
|
#18+
второй вариант точно никуда не годится. На тему первого могут быть варианты -например, в запись о дружбе добавить два логических атрибута "Подвтерждено юзером А", "Подтверждено юзером B". Тогда при предложении дружбы создаем запись вида (ЮзерА, ЮзерB, 1, 0), при подтверждении дружбы юзером B - превращаем запись в (ЮзерА, ЮзерB, 1, 1). По идее записей о дружбе в соц. сети может быть довольно много - так что экономия вдвое может оказаться существенной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 14:19 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37857942&tid=1541624]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
3ms |
| others: | 210ms |
| total: | 360ms |

| 0 / 0 |
