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
Форумы портала PHP.SU :: Версия для печати :: Как лучше спроектировать таблицу в MySQL?
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Как лучше спроектировать таблицу в MySQL?

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

1. Itan - 22 Октября, 2011 - 10:19:25 - перейти к сообщению
Здравствуйте! Подскажите, пожалуйста, как лучше спроектировать таблицу.

Суть в чем: в таблице необходимо указать 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 строк, наверное, будет тратить больше времени на поиск. Может, я ошибаюсь? Посоветуйте.
2. Давит - 22 Октября, 2011 - 12:12:04 - перейти к сообщению
Для каждого юзера создать строку
3. Itan - 22 Октября, 2011 - 12:34:46 - перейти к сообщению
А чем это лучше? На скорость сильно влияет?
4. Данил_123 - 22 Октября, 2011 - 12:53:16 - перейти к сообщению
На скорость не будет влиять, ну порайней мере с 2000 узерами это будет не заметно.. Давит я не понимаю как вы себе представляетд автора?! И даже как бы оно не было не получится записать все в одну строку
5. Давит - 22 Октября, 2011 - 13:14:07 - перейти к сообщению
Itan пишет:
А чем это лучше?

скорость
память
удобно и функционально
6. Мелкий - 22 Октября, 2011 - 13:16:26 - перейти к сообщению
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 Компактно, быстро.
7. Данил_123 - 22 Октября, 2011 - 14:18:04 - перейти к сообщению
Данил_123 пишет:
И даже как бы оно не было не получится записать все в одну строку

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

В:Для каждого юзера создать строку
О:А чем это лучше? На скорость
сильно влияет?
8. Itan - 22 Октября, 2011 - 14:40:07 - перейти к сообщению
Всем большое спасибо за помощь!

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


А что значит "сделать обратное"?
9. EuGen - 22 Октября, 2011 - 14:55:48 - перейти к сообщению
Мелкий пишет:
При том, like не использует индексы

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

у SET, увы, есть существенные ограничения (Вы уже сказали про "если до 64")
10. Данил_123 - 22 Октября, 2011 - 15:04:25 - перейти к сообщению
просто Давит написал поместите пользователя в каждую строку.. Но иначе никак, конечно можно, но изврат получится.. А смыл слов сделать обратное заключался в том чтоб добавить всех юсеров в одну строку..
(Добавление)
капитан очевидность отдыхает
(Добавление)
все хватит, надоело флудить..
11. Itan - 22 Октября, 2011 - 17:35:35 - перейти к сообщению
Можно еще вопрос? Какие доп. данные указывать при создании таблицы по второму варианту? Где для каждого юзера своя строчка. Ну, там, примари или еще что-то?
12. Itan - 23 Октября, 2011 - 10:24:10 - перейти к сообщению
Подскажите плиз

 

Powered by ExBB FM 1.0 RC1