вопрос организации хранилища для разнородных пользователей

Статус
В этой теме нельзя размещать новые ответы.

sniper_9

Новичок
вопрос организации хранилища для разнородных пользователей

Всем привет. У меня в системе есть 3 группы пользователей в разным набором характеристик. Не знаю как правильно хранить о них информацию. Не хочу создавать три разные таблицы. У пользователей есть 5 одинаковых поля (ФИО, логин с паролем). Не знаю как лучше сделать. Подскажите как грамотно это сделать?

Заранее, спасибо.
 

Beavis

Banned
если по дополнительным полям не производится поиск, то можно хранить просто как serialize-массив

-~{}~ 16.12.08 23:09:

ещё можно создать таблицу для доп. характеристик типа:

id | user_id | param_name | value
------------------------------------------------
1 | 23 | icq-number | 123456789
...
 

Духовность™

Продвинутый новичок
а я бы в одну таблицу все запихнул. ничего страшного, что в группе А будет стоять значение NULL в одном из наборов полей.
 

sniper_9

Новичок
посоветовали ещё сделать поле типа blob и все данные уникальных полей хранить в виде xml
 

HraKK

Мудак
Команда форума
Ночной даунизм?
У кого круче стадия?
посоветовали ещё сделать поле типа blob и все данные уникальных полей хранить в виде xml
пока это выигрывает безспорно.
 

AmdY

Пью пиво
Команда форума
о, эврика.
можно хранить в поле blob сразу сам массив с данными, а затем эвалить его.

p.s. Нет, всё же парсинг xml круче :(
 

sniper_9

Новичок
HraKK
Что ты тогда посоветуешь?
Пока все только убедились в твоей безграмотности.
 

HraKK

Мудак
Команда форума
Посоветую делать нормальную нормализированную базу данных, введя дополнительные таблицы.
extra_param
id param name

extra_param_vs_group
id_param id_group

extra_param_value_vs_user
id_param id_user value

-~{}~ 17.12.08 00:44:

Скучна шото, давайте новый цирк на ночь.
 

waldicom

Новичок
а двумя таблицами не обойтись?

option
optionis, optionname

optionval
optionid, mandantid, value
 

Bakti9rov

!*|=?
--cutted--

-~{}~ 17.12.08 04:10:

id | user_id | param_name | value
нечто похожее есть в Wordpress (`posts` vs. `posts_meta`)

-~{}~ 17.12.08 04:12:

а я бы в одну таблицу все запихнул. ничего страшного, что в группе А будет стоять значение NULL в одном из наборов полей.
зачем проверка на NULL? мета-таблицы со связями один-ко-многим между user_group и profile_field будет достаточно. ;)
 

sniper_9

Новичок
Вообщем как и предполагал. Делаем осевую таблицу. К ней крепим кросс таблицу, а через нее уже делаем связку с остальными тремя.
 

korchasa

LIMB infected
Меня одного пугает такое усложнение алгоритма, ради непонятно чего?

Почему не:
common_user: id, [param1, param2,...]
user_type1: id, [extra_param1, extra_param2,...]
user_type2: id, [extra_param1, extra_param2,...]
user_type3: id, [extra_param1, extra_param2,...]
?
 

pilot911

Новичок
так много разных параметров у пользователей ?
понимаю свойства товаров выносить в отдельную таблицу, там могут быть сотни свойств... но в данном случае это выглядит перебором


проще в одной таблице создать все поля свойств и в одном поле определять принадлежность к группе
 

x-yuri

Новичок
варианты с динамическим списком:
extra_param
id param name

extra_param_vs_group
id_param id_group

extra_param_value_vs_user
id_param id_user value
самое нормализованное и целостное решение

-~{}~ 17.12.08 04:12:
а я бы в одну таблицу все запихнул. ничего страшного, что в группе А будет стоять значение NULL в одном из наборов полей.

зачем проверка на NULL? мета-таблицы со связями один-ко-многим между user_group и profile_field будет достаточно.
характеристика может принадлежать только одной группе

таблица для доп. характеристик типа:
id | user_id | param_name | value
неудобно управлять списком и получать инфомрацию о пользователях и их характеристиках

option
optionis, optionname

optionval
optionid, mandantid, value
то же самое, но немного проще получить весь список характеристик

хранения доп характеристик в serialize или xml-виде
получить пользователей и их характеристики удобно, но управлять списком - нет

но у человека наверняка список характеристик фиксированный, поэтому имхо лучший вариант, не раз упоминавшийся - все в одной таблице

common_user: id, [param1, param2,...]
user_type1: id, [extra_param1, extra_param2,...]
user_type2: id, [extra_param1, extra_param2,...]
user_type3: id, [extra_param1, extra_param2,...]
неудобно извлекать список всех пользователей со всеми характеристиками, а экономия на NULL полях неизвестно велика ли

Делаем осевую таблицу. К ней крепим кросс таблицу, а через нее уже делаем связку с остальными тремя.
а в этот вариант как-то не вьехал
 

findnext

Новичок
На мой взгляд вариант товарища HraKKа , пожалуй, единственно правильный с точки зрения теории баз данных
 

Krishna

Продался Java
Ппц, какой умник удалил мой пост? о_О

Единственно верный вариант, если количество групп пользователей не предполагается менять - хранить все возможные поля (и всех пользователей) в одной таблице, добавив поле user_type и не заморачиваться нормализацией, которая тут только добавит геморроя + снизит производительность запросов.
 

findnext

Новичок
полность не согласен, надо думать в перспективе, иначе потом придётся разбивать таблицы и приводить к нормализации 3 степени - а это намного больше гемороя, чем сделать это сразу. Правильно расставленые индексы ну не как не снизят производительность. Да и гемороя совсем не вижу - трудно сделать связь один ко многим и поставить foreign keys, on update, on delete (restrict, cascade)?
 

atv

Новичок
sniper_9, может всё таки сформулируешь более чёткие требования. А то каждый смотрит со своей колокольни. Решение этой задачи сильно зависит от требований.

А именно:
1. нужно ли производить поиск по extended свойствам пользователей;

2. желательно ли накладывать ограничение на значение extended свойств средствами базы;

3. являются ли эти свойства статическими, или известно, что они должны меняться в админке;

4. не участвуют ли extended свойства в связях с другими таблицами;

5. может ещё что-то, щас не соображу.

В зависимости от ответов на эти вопросы можно подобрать наиболее удачное из предложенных решений, каждое из которых имеет право на жизнь при определённых требованиях.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху