Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Подскажите плиз / 25 сообщений из 48, страница 1 из 2
10.05.2010, 11:13
    #36619424
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
Приветствую всех.
Подскажите пожалуйста, со схемой базы.
Задачка следующая, есть группы, и есть участники этих групп.
Участники могут принадлежать этим группам, также могут перемещаться в другую группу.
При этом необходима следующая информация, количество участников группы на текущий момент,
также количество участников на каждый момент, т.е. может быть по дням, по месяцам, по недельная информация
Соотвественно по каждому участнику должная сохраняться информация по участию в группах.

Предпологаю следующую структуру:
Таблица участников:
TblMembersIDGroup_IDMember

Таблица групп:
TblGroupsIDGroup

Таблица истории участия:
TblMemberHistoryMember_IDGroup_IDStartDTEndDT

Что думаете по этому поводу? При этом интересует запрос получения статистики по количествам участников групп, на определенный промежуток времени,
с учетом того что единица деления может быть разной (по дням, по месяца и т.д.)

P.S. Сервер SQL Server 2008
...
Рейтинг: 0 / 0
10.05.2010, 12:38
    #36619507
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
orunbek,
мембер может быть участником нескольких групп одновремнно?
...
Рейтинг: 0 / 0
10.05.2010, 13:09
    #36619541
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
Нет, поэтому и такая структура:
TblMembersIDGroup_ID - т.е. участник может быть членом только одной группы

я думаю такая структура, в принципе "нормальная" вопрос другой теперь, "одним запросом" вытащить статистику по количеству участников группы, хотя это без "циклов" и других подобных методов получить нельзя думаю
...
Рейтинг: 0 / 0
10.05.2010, 13:36
    #36619561
eduard.kasimov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
orunbekНет, поэтому и такая структура:
TblMembersIDGroup_ID - т.е. участник может быть членом только одной группы

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

Group_ID из TblMembers стоит убрать, т.к. оно дублирует данные из TblMemberHistory.
...
Рейтинг: 0 / 0
10.05.2010, 15:48
    #36619707
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
Group_ID в TblMembers нужен для быстрого подсчета количества участников по группам на текущий момент
и... можете подсказать SQL-инструкцию (T-SQL)? так, на вскикду скажем для получения
статистики по количеству участников группы по дням, неделям и месяцам?
спасибо
...
Рейтинг: 0 / 0
10.05.2010, 16:22
    #36619736
eduard.kasimov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
Это форум по проектированию :)
...
Рейтинг: 0 / 0
10.05.2010, 18:08
    #36619826
Senya_L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
orunbek,

Требуется ли хранить хронологию принадлежности участника группе? Т.е. Вам "интересно" через 5 лет в какой группе состоял мембер Иванов?
...
Рейтинг: 0 / 0
10.05.2010, 21:54
    #36619987
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
eduard.kasimovGroup_ID из TblMembers стоит убрать, т.к. оно дублирует данные из TblMemberHistory.
Согласен.
Я бы еще и EndDT из TblMemberHistory убрал, т.к. в этом варианте возможны логические нарушения целостности информации.
...
Рейтинг: 0 / 0
11.05.2010, 05:57
    #36620175
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
krvsaeduard.kasimovGroup_ID из TblMembers стоит убрать, т.к. оно дублирует данные из TblMemberHistory.
Согласен.
Я бы еще и EndDT из TblMemberHistory убрал, т.к. в этом варианте возможны логические нарушения целостности информации.

Senya_Lorunbek,

Требуется ли хранить хронологию принадлежности участника группе? Т.е. Вам "интересно" через 5 лет в какой группе состоял мембер Иванов?
Да нужна, поэтому и Group_ID, StartDT, EndDT, т.е. нужна история участия
...
Рейтинг: 0 / 0
11.05.2010, 09:43
    #36620323
Edkonst2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
orunbekkrvsaeduard.kasimovGroup_ID из TblMembers стоит убрать, т.к. оно дублирует данные из TblMemberHistory.
Согласен.
Я бы еще и EndDT из TblMemberHistory убрал, т.к. в этом варианте возможны логические нарушения целостности информации.

Senya_Lorunbek,

Требуется ли хранить хронологию принадлежности участника группе? Т.е. Вам "интересно" через 5 лет в какой группе состоял мембер Иванов?
Да нужна, поэтому и Group_ID, StartDT, EndDT, т.е. нужна история участия

А может, как говорил eduard.kasimov все же убрать Group_ID из TblMembers и сделать соответствующее представление для активных членов групп? И тогда у Member-а будет возможность состоять в нескольких группах (если надо).
...
Рейтинг: 0 / 0
11.05.2010, 10:15
    #36620385
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
Edkonst2008,

можно и так, в принципе,
только обязательно данные должны соблюдаться следующие условия
1. "Активное участие" это когда в TblMemberHistory EndDT = NULL, т.е. завершения участия нету
2. При завершения участия участника в группе, EndDT обязательно должен хранить значение даты/времени завершения участия

соотвественно sql-инструкия для получения количества участников группы sql-инструкция будет примерно следующей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
	gr.GroupName,
	COUNT(*) AS MembersAmount
from
	TblMemberHistory mh INNER JOIN
	TblGroups gr ON mh.Group_ID=gr.ID
where
	mh.EndDT is NULL
group by
	GroupName
order by
	GroupName

P.S. Поле Group в таблице TblGroups переименовал в GroupName
...
Рейтинг: 0 / 0
11.05.2010, 10:34
    #36620432
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
Вопрос теперь об SQL-инструкции для получения статистики по количеству участников
Попробовал задать в Microsoft SQL Server разделе
Ссылка на тему
...
Рейтинг: 0 / 0
11.05.2010, 13:09
    #36620777
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
orunbekДа нужна, поэтому и Group_ID, StartDT, EndDT, т.е. нужна история участия
"Историю участия" можно получить и без EndDT...
...
Рейтинг: 0 / 0
11.05.2010, 13:14
    #36620791
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
orunbek1. "Активное участие" это когда в TblMemberHistory EndDT = NULL, т.е. завершения участия нету
Завершение участия можно определить и без EndDT... ;)

А вот с EndDT ты получишь неприятную тебе картину. Т.к. таты нужно будет контролировать и проверять еще на всякий т.с. "пожарный случай".

Но дело твоё конечно.
Мне например даже непонятна, после всего, твоя просьба
orunbekПодскажите пожалуйста, со схемой базы.
Поскольку все подсказки по структуре ты отверг.
...
Рейтинг: 0 / 0
11.05.2010, 13:16
    #36620799
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
orunbek2. При завершения участия участника в группе, EndDT обязательно должен хранить значение даты/времени завершения участия

соотвественно sql-инструкия для получения количества участников группы sql-инструкция будет примерно следующей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
	gr.GroupName,
	COUNT(*) AS MembersAmount
from
	TblMemberHistory mh INNER JOIN
	TblGroups gr ON mh.Group_ID=gr.ID
where
	mh.EndDT is NULL
group by
	GroupName
order by
	GroupName

Измени инструкцию и будет тебе счастие и без EndDT... И ничего "обязательного" вообще не будет.
...
Рейтинг: 0 / 0
11.05.2010, 13:27
    #36620824
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
krvsaorunbekДа нужна, поэтому и Group_ID, StartDT, EndDT, т.е. нужна история участия
"Историю участия" можно получить и без EndDT...

возможно я неправильно выразился, StartDT, EndDT нужны для того чтобы определять
какое количество участников в группе было в промежутке времени в разрезе дней, недель, может быть даже часов
...
Рейтинг: 0 / 0
11.05.2010, 13:45
    #36620874
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
orunbek , может быть я тоже выражаюсь не правильно... Но все это можно получить и без EndDT.
...
Рейтинг: 0 / 0
11.05.2010, 15:48
    #36621256
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
krvsa,

можете более подробно рассказать?
...
Рейтинг: 0 / 0
11.05.2010, 15:52
    #36621274
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
orunbek , так это уже не проектирование БД... Это уже по SQL-запросам вопрос... Не та ветка.
...
Рейтинг: 0 / 0
11.05.2010, 18:35
    #36621766
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
krvsa,

ну просто "навскидку" покажите, пожалуйста
...
Рейтинг: 0 / 0
12.05.2010, 09:22
    #36622390
Senya_L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
krvsa orunbek , может быть я тоже выражаюсь не правильно... Но все это можно получить и без EndDT. И даже если у мембера есть перерывы в участии в группе? Тоже интересно, а то Вы уже третий раз упоминаете, что "можно", но не говорите "как" =)
orunbekПри этом интересует запрос получения статистики по количествам участников групп, на определенный промежуток времени,
с учетом того что единица деления может быть разной (по дням, по месяца и т.д.)По поводу группировки я Вам ответил в соседней ветке. Еще раз советую таблицу-календарь.
По поводу структуры. ИМХо, достаточно структуры данных из исходного пОста. Я бы только дополнил схему таким соглашением: если мембер в настоящий момент состоит в какой-то группе, то в EndDT содержится спец. значение (например, '30000101' - литерал для MSSQL). И еще EndDT включить в PK. И добавить контроль на непересекаемость интервалов в TblMemberHistory с одним GroupID. Если требуется надежная схема, то потребуется разрулить блокировками. Но это уже тема для ветки по конкретной СУБД.
...
Рейтинг: 0 / 0
12.05.2010, 10:52
    #36622574
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
Senya_LИ даже если у мембера есть перерывы в участии в группе?
Добавь в табличку "истории участия" запись с пустым Group_ID - получишь "просто выход их группы".

Получить аналог EndDT можно запросом. Время на это конечно потратится... Но зато за целостностью данных следить не нужно.

Сам запрос не привожу тут принципиально. Т.к. это не sqlный раздел. Если кото не может его придумать - прото выложите пример структуры и задайте этот вопрос в соответствующей ветке.
Ответ не заставит себя ждать.
...
Рейтинг: 0 / 0
12.05.2010, 10:54
    #36622578
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
Senya_LЯ бы только дополнил схему таким соглашением: если мембер в настоящий момент состоит в какой-то группе, то в EndDT содержится спец. значение (например, '30000101' - литерал для MSSQL).
ППЦ!

Senya_LИ еще EndDT включить в PK. И добавить контроль на непересекаемость интервалов в TblMemberHistory с одним GroupID. Если требуется надежная схема, то потребуется разрулить блокировками. Но это уже тема для ветки по конкретной СУБД.
Выше всяких похвал!
Но на деле имеет место. Встречал такое не раз...
...
Рейтинг: 0 / 0
12.05.2010, 14:13
    #36623215
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
krvsaSenya_LИ даже если у мембера есть перерывы в участии в группе?
Добавь в табличку "истории участия" запись с пустым Group_ID - получишь "просто выход их группы".


Вы тогда будете хранить переходы состояний. По сути, это другая модель данных, которая учитывает другие сущности. Это исключительно неудобно в плане получения состояния объекта в момент времени, поскольку в системе нет адекватных сущностей для решения этой задачи.

Хранение (StartDT, EndDT) позволяет непосредственно получать интересующее нас состояние объекта.

Для большего упрощения в EndDT вместо NULL лучше хранить самую большую дату. Тогда вам не придётся в ретроспективных запросах специально учитывать участия открытые на текущее время.

Исключение EndDT ничем не упростит контроль целостности данных (в некоторых случаях даже усложнит), поскольку нет декларативных ограничений целостности, которые не позволят включить человека в команду дважды, или дважды исключить его или исключить из команды человека, который в ней никогда не состоял или сначала исключить чеолвека, а потом включить его в команду.
...
Рейтинг: 0 / 0
12.05.2010, 22:56
    #36624400
Senya_L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите плиз
krvsaSenya_LИ еще EndDT включить в PK. И добавить контроль на непересекаемость интервалов в TblMemberHistory с одним GroupID. Если требуется надежная схема, то потребуется разрулить блокировками. Но это уже тема для ветки по конкретной СУБД.
Выше всяких похвал!
Но на деле имеет место. Встречал такое не раз...Задумывались почему встречали "такое"?
krvsaSenya_LЯ бы только дополнил схему таким соглашением: если мембер в настоящий момент состоит в какой-то группе, то в EndDT содержится спец. значение (например, '30000101' - литерал для MSSQL).
ППЦ! Т.е. krvsa из г. Волжский - это авторитет, а профессор Снодграсс - так, пацан, мелкий ламерюга. Вот это действительно пипец. :)
Кроме "пипцов" будет адекватная критика?
krvsaSenya_LИ даже если у мембера есть перерывы в участии в группе?
Добавь в табличку "истории участия" запись с пустым Group_ID - получишь "просто выход их группы".

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


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