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 :: Как лучше спроектировать таблицу в MySQL?

 PHP.SU

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


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

> Без описания
Itan
Отправлено: 22 Октября, 2011 - 10:19:25
Post Id


Частый гость


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


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




Здравствуйте! Подскажите, пожалуйста, как лучше спроектировать таблицу.

Суть в чем: в таблице необходимо указать id пользователя и его groupid.

У меня есть 2 варианта:

1. В первой колонке указываем groupid, а во второй перечисляем id юзеров.
CODE (htmlphp):
скопировать код в буфер обмена
  1. ++++++++++++++++++++++
  2. +          +         +
  3. + groupid  +  id     +
  4. +          +         +
  5. ++++++++++++++++++++++
  6. + 1        + 1, 2, 10+
  7. ++++++++++++++++++++++
  8. + 2        + 14, 3, 7+
  9. ++++++++++++++++++++++
  10. + 3        + 8, 4    +
  11. ++++++++++++++++++++++


2. Для каждого юзера создаем одну строку:
CODE (htmlphp):
скопировать код в буфер обмена
  1. ++++++++++++++++++++++
  2. +          +         +
  3. + groupid  +  id     +
  4. +          +         +
  5. ++++++++++++++++++++++
  6. + 1        + 1       +
  7. ++++++++++++++++++++++
  8. + 1        + 7       +
  9. ++++++++++++++++++++++
  10. + 3        + 8       +
  11. ++++++++++++++++++++++
  12. + 2        + 98      +
  13. ++++++++++++++++++++++
  14. + 2        + 15      +
  15. ++++++++++++++++++++++
  16. + 2        + 4       +
  17. ++++++++++++++++++++++


Какой вариант лучше, если будет около 10 groupid и около 2000 id?
В скрипте такая конструкция запроса: "Взять groupid где id=int". Т.е. нужно узнать группу, в которой состоит юзер.
(Добавление)
Мне кажется, что лучше первый вариант, потому что 20000 строк, наверное, будет тратить больше времени на поиск. Может, я ошибаюсь? Посоветуйте.
 
 Top
Давит
Отправлено: 22 Октября, 2011 - 12:12:04
Post Id



Частый гость


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


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




Для каждого юзера создать строку
 
 Top
Itan
Отправлено: 22 Октября, 2011 - 12:34:46
Post Id


Частый гость


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


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




А чем это лучше? На скорость сильно влияет?
 
 Top
Данил_123
Отправлено: 22 Октября, 2011 - 12:53:16
Post Id


Участник


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


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




На скорость не будет влиять, ну порайней мере с 2000 узерами это будет не заметно.. Давит я не понимаю как вы себе представляетд автора?! И даже как бы оно не было не получится записать все в одну строку

(Отредактировано автором: 22 Октября, 2011 - 14:10:21)



-----
http://mysitecost.ru
 
 Top
Давит
Отправлено: 22 Октября, 2011 - 13:14:07
Post Id



Частый гость


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


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




Itan пишет:
А чем это лучше?

скорость
память
удобно и функционально
 
 Top
Мелкий Супермодератор
Отправлено: 22 Октября, 2011 - 13:16:26
Post Id



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


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


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




Itan пишет:
Мне кажется, что лучше первый вариант, потому что 20000 строк, наверное, будет тратить больше времени на поиск.

А теперь - посчитайте, сколько понадобится времени, чтобы выбрать всех пользователей из группы 1, например. И заодно, как вы это будете делать?
Like'ом? не забудете о том, что like '%1%' прихватит ещё 11, 12 и т.д. группы, а Like '%,1,%' не сматчит юзера с группами '1,2,3'? При том, like не использует индексы.

Однозначно второй вариант. Mysql'у и несколько млн строк - не помеха.

А если групп до 64 штук и они редко расширяются, то хорошим решением будет set и поиск через FIND_IN_SET. http://dev[dot]mysql[dot]com/doc/refman/5[dot]1/en/set[dot]html Компактно, быстро.


-----
PostgreSQL DBA
 
 Top
Данил_123
Отправлено: 22 Октября, 2011 - 14:18:04
Post Id


Участник


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


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




Данил_123 пишет:
И даже как бы оно не было не получится записать все в одну строку

ммм.. Давит раз вы предлогаете записать каждого в новую строку, поясните мне как сделать обратное? Или же зачем предлогать? мб возможно, но это будет выглядет страшно...

В:Для каждого юзера создать строку
О:А чем это лучше? На скорость
сильно влияет?


-----
http://mysitecost.ru
 
 Top
Itan
Отправлено: 22 Октября, 2011 - 14:40:07
Post Id


Частый гость


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


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




Всем большое спасибо за помощь!

Данил_123 пишет:
поясните мне как сделать обратное?


А что значит "сделать обратное"?
 
 Top
EuGen Администратор
Отправлено: 22 Октября, 2011 - 14:55:48
Post Id


Профессионал


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


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




Мелкий пишет:
При том, like не использует индексы

LIKE '%str%' - нет, не использует,
LIKE 'str%' - использует

у SET, увы, есть существенные ограничения (Вы уже сказали про "если до 64")


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Данил_123
Отправлено: 22 Октября, 2011 - 15:04:25
Post Id


Участник


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


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




просто Давит написал поместите пользователя в каждую строку.. Но иначе никак, конечно можно, но изврат получится.. А смыл слов сделать обратное заключался в том чтоб добавить всех юсеров в одну строку..
(Добавление)
капитан очевидность отдыхает
(Добавление)
все хватит, надоело флудить..


-----
http://mysitecost.ru
 
 Top
Itan
Отправлено: 22 Октября, 2011 - 17:35:35
Post Id


Частый гость


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


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




Можно еще вопрос? Какие доп. данные указывать при создании таблицы по второму варианту? Где для каждого юзера своя строчка. Ну, там, примари или еще что-то?
 
 Top
Itan
Отправлено: 23 Октября, 2011 - 10:24:10
Post Id


Частый гость


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


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




Подскажите плиз
 
 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