Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: В чем сложность структуры социальной сети

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
prog90
Отправлено: 17 Августа, 2011 - 18:31:22
Post Id


Гость


Покинул форум
Сообщений всего: 78
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Почему говорят, что сложно построить таблицу для друзей?
Просто составить таблицу, в которой будет три столбца - id, friend_id_1, friend_id_2. И исключить по одной строке из пар, где значения второго и третьего полей равны. Для 250 000 пользователей, даже если они будут все друг с другом дружить, то получиться около 250 000 000 000 байт, 250 Гб. (три столбца который хранят от 1 до 250000 это где-то по 2,5 байта для одного столбца. 8*250000*250000/2 = 4* 625 * 100 000 000 = 250 000 000 000).
Получается на это хватит одного винчестера.
Сделать эту таблицу меньше наверное нельзя. Какие тогда оптимизации или нормализацию можно придумать еще.
Или сложность проектирования табли для социальной сети состоит в чем-то другом?
 
 Top
Мелкий Супермодератор
Отправлено: 17 Августа, 2011 - 19:36:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




prog90 пишет:
Сделать эту таблицу меньше наверное нельзя.

Можно. Первое поле не нужно.


-----
PostgreSQL DBA
 
 Top
White
Отправлено: 17 Августа, 2011 - 19:50:57
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




prog90 пишет:
от 1 до 250000
для этого вам потребуется 18бит (2 в 18степени). делаем простой подсчет:
250000*18*2=9 000 000бит=1125000байт=1.07288361Мб.
поправьте меня если я не прав


-----
if(time()>1356048000) die();
 
 Top
prog90
Отправлено: 17 Августа, 2011 - 19:59:22
Post Id


Гость


Покинул форум
Сообщений всего: 78
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




White
Так нет, а там же нужно 250 000 * 250 000, т.е. каждый из них дружит с каждым. Максимальное число.
(Добавление)
Мелкий
А таблица без первого ключа, это значит что не primary key, а к такой таблице можно select делать? Зачем кстати primary key вообще нужен? Просто то что он есть это значит что таблица нормализована, но зачем он сам по себе нужен? Кроме случаев когда это например id пользователя, который нужен чтобы его запомнить в сессии и чтобы он менше места занимал. И чтобы по нему можно было найти точно пользователя потому что имя может повторятся у разных пользователей.

(Отредактировано автором: 17 Августа, 2011 - 20:04:19)

 
 Top
White
Отправлено: 17 Августа, 2011 - 20:24:07
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




prog90 да, ошибся, только 250 000 * 250 000 будут две одинаковые пары. так что 250 000 * 250 000 / 2, и в итоге:
250 000 * 250 000 * 18 / 8 / 1 024 / 1 024 / 1 024 = 130.967237 (Гб)
для 2 полей.
первичный ключ тут ни к чему, каждая пара будет уникальной.


-----
if(time()>1356048000) die();
 
 Top
Мелкий Супермодератор
Отправлено: 17 Августа, 2011 - 20:27:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




prog90, PK (primary key) на 2 поля, так же известный, как составной ключ.

prog90 пишет:
Просто то что он есть это значит что таблица нормализована

Ни в коем случае. PK не ведёт к нормализации. Нормализация ведёт к созданию PK.
PK позволяет однозначно идентифировать строку в таблице. Всё.

prog90 пишет:
А таблица без первого ключа, это значит что не primary key, а к такой таблице можно select делать?

Запросто. Ещё и быстрее инсерты проходить будут, т.к. индексы перестраивать не нужно. А вот выборки пострадают.


-----
PostgreSQL DBA
 
 Top
prog90
Отправлено: 17 Августа, 2011 - 20:32:40
Post Id


Гость


Покинул форум
Сообщений всего: 78
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




А что дает составной ключ? Он упрощает написание запроса SELECT? Или что он дает. Просто по id можно найти типа select .... where id = 3; А составной ключ что даст?
 
 Top
Мелкий Супермодератор
Отправлено: 17 Августа, 2011 - 21:30:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




При составном ключе на friend_id_1, friend_id_2 смысла в id нет никакого.

prog90 пишет:
Просто по id можно найти типа select .... where id = 3; А составной ключ что даст?

Однозначно укажет на where friend_id_1=10 and friend_id_2=20
В общем, курите маны на реляционные базы данных. А потом на EXPLAIN SELECT


-----
PostgreSQL DBA
 
 Top
prog90
Отправлено: 18 Августа, 2011 - 19:56:55
Post Id


Гость


Покинул форум
Сообщений всего: 78
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Т.е. позволит быстрее найти пару friend_id_1, friend_id_2? Первичный ключ похож на индекс?
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Августа, 2011 - 08:09:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Мелкий пишет:
При составном ключе на friend_id_1, friend_id_2 смысла в id нет никакого
Как это нет? А удалить/удалиться из друзей?
 
 Top
White
Отправлено: 19 Августа, 2011 - 08:14:31
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




DeepVarvar WHERE friend_id_1=... AND friend_id_2=...


-----
if(time()>1356048000) die();
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Августа, 2011 - 08:19:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Аааа черт... Сплю еще - почему-то спящий мосх подумал про сообщухи и их удаление и хитрым нейронным способом прикрутил эту часть осознания к списку фройндов...
Пойду кофейку намучу... Закатив глазки
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB