Автор Тема: Посоветуйте, каким образом целесообразней хранить инфу о том, в каких группах юзер.  (Прочитано 3478 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Гаррилл

  • Наглый тип
  • Постоялец
  • ***
  • Сообщений: 202
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phpbbcms.sf.net
Я ещё не опытный, с большими объёмами данных дела не имел. Есть 2 варианта. А я чешу репу. Вся работа с СУБД.
Вариант первый:
Есть таблицs users и users_groups. Пользователь может состоять в нескольких группах. А инфа, в каких юзер группах, хранится в таблице users в поле varchar вида 1,2,3,4,5,6,7.
Есть же второй вариант:
Заводить ещё одну таблицу user_group_info с полями user_id, group_id.
Удобнее работать со вторым вариантом, но быстрее ли? Ведь инфа о том, в каких юзер группах мне нужна будет абсолютно на каждой странице сайта. Что, если у меня 1 000 000 зарегистрированных пользователей и 1000 групп. А пользователь в среднем состоит в 5 группах. Каждый раз селектить из 5 000 000 ???

Хочу услышать советы опытных программеров, как грамотнее составить структуру :beer:

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
Гаррилл
Ну в принципе, теоретически (люблю я это слово :)) второй вариант правильнее, так как обеспечивается большая степень нормализации данных. Однако грузить это будет прилично. Особенно MySQL. Но я бы остановился на втором варианте.
Обычно под 1 000 000 пользователей надо ставить отдельный сервер.
Тут уже вопрос общей производительности.

Потом ты можешь производить однократную выборку этих данных и не дергать их каждый раз из базы.
AS IS...

Оффлайн Гаррилл

  • Наглый тип
  • Постоялец
  • ***
  • Сообщений: 202
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phpbbcms.sf.net
Цитировать
второй вариант правильнее, так как обеспечивается большая степень нормализации данных.

Да. Вот этим он мне и нравится.
Цитировать
Обычно под 1 000 000 пользователей надо ставить отдельный сервер.

Это понятно. У простых смертных столько не бывает. Хозяева таких проектов серьёзные люди и на хостинг потратятся.
Цитировать
Тут уже вопрос общей производительности.

Нарпимер, у варчара максимальное значение 255, а это юзер в 122 группах - надо больше. Есть ещё вариант хранить в сумме степеней двойки (int), но тоже не катит: если у юзера записано 25, то он в группах 9 и 16 и т.д.
Цитировать
Потом ты можешь производить однократную выборку этих данных и не дергать их каждый раз из базы.

А что, если при каждом юзерском log_in собирать всю инфу о группах и класть её в сессии - не, тоже ботва.
Придётся по-ходу при каждом лоаде делать
SELECT group_id FROM user_group_info WHERE user_id = 2
Если тут будут максимум 2 поля с медиуминтами и user_status tinyint(1). Индекс поставлю только на group_id.
Может это поможет :)))

Оффлайн ThE0ReTiC

  • Главный по тарелочкам
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 4041
  • +2/-0
  • 2
    • Просмотр профиля
    • http://
Цитировать
log_in собирать всю инфу о группах и класть её в сессии

Почему ботва?
AS IS...

Оффлайн Гаррилл

  • Наглый тип
  • Постоялец
  • ***
  • Сообщений: 202
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phpbbcms.sf.net
ThE0ReTiC
Цитировать
Почему ботва?

Сессии у меня в Базе лежат в HEAPе - это у меня сильно переделанный phpBB. Там реализован второй способ. Но очень плохо и с правами групп полная лажа там.
В HEAPе блобы или тексты не поставишь. А менять не хочется: хипы быстрее. А вот 1,2,3,4,5 в VARCHAR можно и в юзерской таблице хранить. Но это же maxlength = 255 а это 84 группы максимум. Не катит. Text тоже не катит. Буду хранить только 3 поля в проиндексированной таблице и селектить.

Оффлайн golden-den

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 118
  • +0/-0
  • 0
    • Просмотр профиля
    • http://kosmos13.narod.ru
Гаррилл
что за проект у тебя , если не секрет расскажи
Ты что задумал сделать перепись населения в Китае?
(в России вряд ли, тк к ней заранее, я думаю, готовились)

Оффлайн rembo

  • Больной
  • Постоялец
  • ***
  • Сообщений: 219
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.v4.ru
На кой тебе стоко групп? Помоему у тебя несколько отвлеченное понятие о группах. Чем система больше и чем больше в ней юзеров тем четче и конкретней должны быть определены группы и привилегии для них. Как ты собираешься управляться с 84 группами я понятия не имею. Вапще рекомендуется обходиться 3-мя, 4-мя группами для юзеров (где-то я это вычитал), ну максимум 10-ю.
программист должен все сделать так, чтоб потом ничего не делать

Оффлайн Гаррилл

  • Наглый тип
  • Постоялец
  • ***
  • Сообщений: 202
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phpbbcms.sf.net
http://phpbbcms.sf.net
OpenSource проект. Предназначен для многих задач. Пишу с не с нуля. А за основу взял ядро phpBB (сессии, движок шаблонов, емэйлер).
Добавляю туда очень много фич. Недавно сделал продвинутую систему side-blocks. Можно добавлять блоки на разные страницы с текстовым контентом (смайлики, бб-код, хтмл-коды ставить можно) или блоки которые работают на функциях файлов (выводят результаты запросов), например "Блок: 10-ка лучших статей". Блоки можно располагать сверху, снизу, справа, слева, менять их порядок. У каждого блока свой шаблон.
Уже сделал новую панель управления группами, осталось её в систему интегрировать. Группы можно создавать как локальные (для одного модуля), так и глобальные (для всех), с автоматическим переходом пользователя в группу по достижении определённого ранга или по согласованию с модератором группы.
Настроить права можно к каждому модулю и подмодулю (это может быть и раздел форума, и категория новостей, и раздел админпанели) чекбоксами
на одной странице ряд действий (их добавить легко, вписав в массив) и список глобальных групп и групп для этого модуля. Сидит админ и наяривает - получается очень удобно.
Если пользователь находится в нескольких группах, то берётся максимальное право доступа. Вот так: SELECT MAX(to_view) AS to_view, MAX(to_read) AS to_read FROM cms_permissions WHERE group_id IN (1,2,3,4) AND mod_id = 3.
Скоро начну делать новую UserCP. Она тоже будет модульной. Т.е., добавляя один файл в определённую директорию, появится ещё один пункт меню и там юзер сможет запостить, например, конфигурацию своего компа. Добавить поля для профиля можно будет через админ-панель.
После всего этого начнём делать модуль новостей и другие.
Цитировать
На кой тебе стоко групп?

Не хочу, чтобы были ограничения. Если админ захочет сделать сто групп, то пусть делает - хозяин-барин
Скорость для нас не маловажна. Поэтому и структуры некоторых таблиц тоже реорганизуем.
« Последнее редактирование: 29 Октября 2002, 13:08:35 от Гаррилл »

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28