powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / профили пользователей - 2 подхода
16 сообщений из 16, страница 1 из 1
профили пользователей - 2 подхода
    #35301172
AxelTv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо хранить информацию о пользователях ( пол, возраст, страна, город, адрес и т.д.) Этот набор может измениться в будущем.

Два явных метода решения:

I) Одна таблица Users со всеми этими полями ( пол, возраст... )

II) Таблица Users с основными данными ( * UserID, Login, Password, Email ) и таблица Profile ( * UserID, * PropertyName (nvarchar), PropertyValue).

необходимо будет делать выборку по UserID, а так же осуществлять поиск пользователей по параметрам профиля ( н-р по полу )

Второй способ позволяет добавлять новые параметры профиля без изменения схемы БД. Однако, как вы думаете, является ли второй метод настолько медленнее первого в выполнении запросов, что от него придётся отказаться? Скажем при 10000 пользователей и 10 параметрах профиля ( т.е 100 000 записей в таблице Profile )
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35301210
Осака Вестингауз
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поиск "EAV модель"
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35301780
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxelTvявляется ли второй метод настолько медленнее первого в выполнении запросов
Смотря какие запросы будут... Какая у вас стоит задача? Если просто проверить "есть ли такой пользователь" - это одно. Если строить аналитику по анализу состава пользователей - немного другое...
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35301996
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первый точно подход не очень, годится если делать что-то очень простое и которотко-живущее, аля анкета-на-пикник.

второй подход лучше, но тоже не очень из-за (pkey, PropertyName (nvarchar), PropertyValue) .

Лучше сделать 3 или более таблиц, вроде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Users  (UserID*, -- pkey 
           Login, 
           Password, 
           Email, 
           ProfileID , --fkey to Profiles.ProfileID
           Status, 
           DateCreated)

Profiles (ProfileID*, --pkey
             Gender,
             ...
             ... -- profile attributes that make sense and will be used in searches    
             ... )

ProfilesAddInfo (ProfileID, --fkey to Profiles.ProfileID  
                       PropertyName, 
                       PropertyValue
                      )

нормальную инфу, то что будете использовать ( пол, возраст, страна, город, адрес и т.д.) храните в
в Profiles, а всякий "мусор" можно хранить в ProfilesAddInfo.

Если появляется требование xранить дополнительную информацию то можно или изменит Profiles и добавить туда доп. поле, например в случае если надо хранить номер телефона, или добавлять данные в ProfilesAddInfo, если дупистим появилось требование хранить какое-нибудь инфо вроде (ЦветБрасетки text)
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35302338
AxelTv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
Смотря какие запросы будут... Какая у вас стоит задача? Если просто проверить "есть ли такой пользователь" - это одно. Если строить аналитику по анализу состава пользователей - немного другое...

Сложная аналитика будет выполняться очень редко. Основное - н-р выборка пользователей по полу, по стране, по возрасту и т.д.
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35302357
AxelTv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konstantin~
Лучше сделать 3 или более таблиц, вроде
....


Не понимаю, зачем в вашем случае выносить основную инфу в таблицу Profiles, а не в Users. Насколько критична разница во времени выполнения поиска пользователей по "основному полю" из Profiles и по "дополнительному" из ProfilesAddInfo?
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35302359
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxelTvСложная аналитика будет выполняться очень редко.
Ну вот и ответ...
В любом случае серия тестов покажет какие "недостатки" у той или иной системы хранения данных.
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35303455
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konstantin~первый точно подход не очень, годится если делать что-то очень простое и которотко-живущее, аля анкета-на-пикник.И тем неменее весь мир упорно прется по этому неправильному пути на "пикник-анкетирование".
А вы им раскрыли глаза...

PS: Прочитайте про EAV.
И прикиньте сколько будет формироваться аналитика по паре млн. анкет с фильтрацией по 10 условиям (разными условиями: сравнение по значению, комбинации AND и OR, заполнено/не заполнено) и группировкой по 3-м полям, например...

После этого советуйте.

PS2: EAV структуры кажутся решением всех проблем хранения атрибутов, но при этом в реальной жизни создают много неудобств в обработке данных.
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35303458
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxelTvОсновное - н-р выборка пользователей по полу, по стране, по возрасту и т.д.Я бы рекомендовал внести все основные поля по которым будет проводиться поиск в основную таблицу USERS.

Если есть реальная потребность в динамических атрибутах, по которым не будет аналитики - добавьте EAV (подход 2)
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35303639
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxelTv
Не понимаю, зачем в вашем случае выносить основную инфу в таблицу Profiles, а не в Users. Насколько критична разница во времени выполнения поиска пользователей по "основному полю" из Profiles и по "дополнительному" из ProfilesAddInfo?

"зачем две таблицы?" :
просто удобнее будет работать когда данные которые по существу относятся и используются при логине (и/или авторизации) находятся в отдельном месте и не перемешаны с доп. данными из profiles. Такой подход может в последствии сильно облегчить жизнь если надо что-то менять в проекте. Иными словами такой подход дает доп. преимущества, а понадобятся-ли они в вашем проэкте я не знаю.

"на сколько быстрее?":
при небольшом кол-ве записей ( < 10М ) и стандартном оборудовании (modern x86 / х86_64 hardware) существенной разницы по скорости не будет, даже учитывая тот факт что индекс по основному полю в Profiles сделать проще чем partial index (если оный поддерживает ваш север бд) по доп. полям в ProfilesAddInfo. Просто если данные представляют определённую ценность т.е. бизнес-требования налагают определённые ограничения на корректность данных, то это намного проще сделать в случае с основными полями в Profiles (т.е. пол -> подстановка из списка, max_year <год рождения < min_year и тд.) чем с данными сохранёнными в виде (id, AttrName, AttrValue)
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35303644
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelyИ тем неменее весь мир упорно прется по этому неправильному пути на "пикник-анкетирование". А вы им раскрыли глаза...


PS: Прочитайте про EAV.
И прикиньте сколько будет формироваться аналитика по паре млн. анкет с фильтрацией по 10 условиям (разными условиями: сравнение по значению, комбинации AND и OR, заполнено/не заполнено) и группировкой по 3-м полям, например...

После этого советуйте.

PS2: EAV структуры кажутся решением всех проблем хранения атрибутов, но при этом в реальной жизни создают много неудобств в обработке данных.

2 Bely
про то что "весь мир" проектирует базы виде одной большой таблицы вы меня не убедили.

Я знаю о существовании EAV модели, и таковая имеет смысл если данные не несут особого смысла кроме как для приложения которое их использует (хранения сереализованых данных классов и проч). В других случаях часто имеются требование по обеспечению корректности данных, а вот тут у EAV-модели проблемы.
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35305778
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konstantin~2 Bely
про то что "весь мир" проектирует базы виде одной большой таблицы вы меня не убедили.Я не говорил про одну большую таблицу.
Я говорил про использование стандартных реляционных таблиц вместо EAV.

Konstantin~Я знаю о существовании EAV модели...
Код: plaintext
1.
2.
3.
ProfilesAddInfo (ProfileID, --fkey to Profiles.ProfileID  
                       PropertyName, 
                       PropertyValue
                      )
Что это такое, если не урезанный EAV ?
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35305833
MrPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если сотрудник поменяет фамилию? (заумуж выйдет или еще что)
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35308328
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrPavelа если сотрудник поменяет фамилию? (заумуж выйдет или еще что)А если это никого не интересует?
Для начала надо выяснить что проектируется - Отдел кадров или Интернет форум
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35313627
_Kostyan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для различных модулей твоего проекта существует ОГРОМНЫЙ дисбаланс потребления ресурсов => оптимизировать имеет смысл 10%-0.1% кода проекта (чаще <1%),
для остальных 99% надо делать не "быстрее" а "правильнее".

так вот если это не аналог отдела кадров, то естественно надо разбивать на ряд таблиц.
(хотя в противном случае (если запросы с пользователями являются критичными по скорости) все равно почти всегда разбиение нужно)
вотЪ
...
Рейтинг: 0 / 0
профили пользователей - 2 подхода
    #35314590
_Kostyan_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для различных модулей твоего проекта существует ОГРОМНЫЙ дисбаланс потребления ресурсов => оптимизировать имеет смысл 10%-0.1% кода проекта (чаще <1%),
для остальных 99% надо делать не "быстрее" а "правильнее".

так вот если это не аналог отдела кадров, то естественно надо разбивать на ряд таблиц.
(хотя в противном случае (если запросы с пользователями являются критичными по скорости) все равно почти всегда разбиение нужно)
вотЪ
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / профили пользователей - 2 подхода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]