|
|
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Приветствую всех. Подскажите пожалуйста, со схемой базы. Задачка следующая, есть группы, и есть участники этих групп. Участники могут принадлежать этим группам, также могут перемещаться в другую группу. При этом необходима следующая информация, количество участников группы на текущий момент, также количество участников на каждый момент, т.е. может быть по дням, по месяцам, по недельная информация Соотвественно по каждому участнику должная сохраняться информация по участию в группах. Предпологаю следующую структуру: Таблица участников: TblMembersIDGroup_IDMember Таблица групп: TblGroupsIDGroup Таблица истории участия: TblMemberHistoryMember_IDGroup_IDStartDTEndDT Что думаете по этому поводу? При этом интересует запрос получения статистики по количествам участников групп, на определенный промежуток времени, с учетом того что единица деления может быть разной (по дням, по месяца и т.д.) P.S. Сервер SQL Server 2008 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2010, 11:13 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbek, мембер может быть участником нескольких групп одновремнно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2010, 12:38 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Нет, поэтому и такая структура: TblMembersIDGroup_ID - т.е. участник может быть членом только одной группы я думаю такая структура, в принципе "нормальная" вопрос другой теперь, "одним запросом" вытащить статистику по количеству участников группы, хотя это без "циклов" и других подобных методов получить нельзя думаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2010, 13:09 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbekНет, поэтому и такая структура: TblMembersIDGroup_ID - т.е. участник может быть членом только одной группы я думаю такая структура, в принципе "нормальная" вопрос другой теперь, "одним запросом" вытащить статистику по количеству участников группы, хотя это без "циклов" и других подобных методов получить нельзя думаюИспользуйте SQL, обойдетесь без "циклов" и других подобных методов". Group_ID из TblMembers стоит убрать, т.к. оно дублирует данные из TblMemberHistory. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2010, 13:36 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Group_ID в TblMembers нужен для быстрого подсчета количества участников по группам на текущий момент и... можете подсказать SQL-инструкцию (T-SQL)? так, на вскикду скажем для получения статистики по количеству участников группы по дням, неделям и месяцам? спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2010, 15:48 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Это форум по проектированию :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2010, 16:22 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbek, Требуется ли хранить хронологию принадлежности участника группе? Т.е. Вам "интересно" через 5 лет в какой группе состоял мембер Иванов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2010, 18:08 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
eduard.kasimovGroup_ID из TblMembers стоит убрать, т.к. оно дублирует данные из TblMemberHistory. Согласен. Я бы еще и EndDT из TblMemberHistory убрал, т.к. в этом варианте возможны логические нарушения целостности информации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2010, 21:54 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsaeduard.kasimovGroup_ID из TblMembers стоит убрать, т.к. оно дублирует данные из TblMemberHistory. Согласен. Я бы еще и EndDT из TblMemberHistory убрал, т.к. в этом варианте возможны логические нарушения целостности информации. Senya_Lorunbek, Требуется ли хранить хронологию принадлежности участника группе? Т.е. Вам "интересно" через 5 лет в какой группе состоял мембер Иванов? Да нужна, поэтому и Group_ID, StartDT, EndDT, т.е. нужна история участия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 05:57 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbekkrvsaeduard.kasimovGroup_ID из TblMembers стоит убрать, т.к. оно дублирует данные из TblMemberHistory. Согласен. Я бы еще и EndDT из TblMemberHistory убрал, т.к. в этом варианте возможны логические нарушения целостности информации. Senya_Lorunbek, Требуется ли хранить хронологию принадлежности участника группе? Т.е. Вам "интересно" через 5 лет в какой группе состоял мембер Иванов? Да нужна, поэтому и Group_ID, StartDT, EndDT, т.е. нужна история участия А может, как говорил eduard.kasimov все же убрать Group_ID из TblMembers и сделать соответствующее представление для активных членов групп? И тогда у Member-а будет возможность состоять в нескольких группах (если надо). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 09:43 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Edkonst2008, можно и так, в принципе, только обязательно данные должны соблюдаться следующие условия 1. "Активное участие" это когда в TblMemberHistory EndDT = NULL, т.е. завершения участия нету 2. При завершения участия участника в группе, EndDT обязательно должен хранить значение даты/времени завершения участия соотвественно sql-инструкия для получения количества участников группы sql-инструкция будет примерно следующей: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. P.S. Поле Group в таблице TblGroups переименовал в GroupName ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 10:15 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Вопрос теперь об SQL-инструкции для получения статистики по количеству участников Попробовал задать в Microsoft SQL Server разделе Ссылка на тему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 10:34 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbekДа нужна, поэтому и Group_ID, StartDT, EndDT, т.е. нужна история участия "Историю участия" можно получить и без EndDT... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 13:09 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbek1. "Активное участие" это когда в TblMemberHistory EndDT = NULL, т.е. завершения участия нету Завершение участия можно определить и без EndDT... ;) А вот с EndDT ты получишь неприятную тебе картину. Т.к. таты нужно будет контролировать и проверять еще на всякий т.с. "пожарный случай". Но дело твоё конечно. Мне например даже непонятна, после всего, твоя просьба orunbekПодскажите пожалуйста, со схемой базы. Поскольку все подсказки по структуре ты отверг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 13:14 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbek2. При завершения участия участника в группе, EndDT обязательно должен хранить значение даты/времени завершения участия соотвественно sql-инструкия для получения количества участников группы sql-инструкция будет примерно следующей: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Измени инструкцию и будет тебе счастие и без EndDT... И ничего "обязательного" вообще не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 13:16 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsaorunbekДа нужна, поэтому и Group_ID, StartDT, EndDT, т.е. нужна история участия "Историю участия" можно получить и без EndDT... возможно я неправильно выразился, StartDT, EndDT нужны для того чтобы определять какое количество участников в группе было в промежутке времени в разрезе дней, недель, может быть даже часов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 13:27 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbek , может быть я тоже выражаюсь не правильно... Но все это можно получить и без EndDT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 13:45 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsa, можете более подробно рассказать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 15:48 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbek , так это уже не проектирование БД... Это уже по SQL-запросам вопрос... Не та ветка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 15:52 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsa, ну просто "навскидку" покажите, пожалуйста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2010, 18:35 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsa orunbek , может быть я тоже выражаюсь не правильно... Но все это можно получить и без EndDT. И даже если у мембера есть перерывы в участии в группе? Тоже интересно, а то Вы уже третий раз упоминаете, что "можно", но не говорите "как" =) orunbekПри этом интересует запрос получения статистики по количествам участников групп, на определенный промежуток времени, с учетом того что единица деления может быть разной (по дням, по месяца и т.д.)По поводу группировки я Вам ответил в соседней ветке. Еще раз советую таблицу-календарь. По поводу структуры. ИМХо, достаточно структуры данных из исходного пОста. Я бы только дополнил схему таким соглашением: если мембер в настоящий момент состоит в какой-то группе, то в EndDT содержится спец. значение (например, '30000101' - литерал для MSSQL). И еще EndDT включить в PK. И добавить контроль на непересекаемость интервалов в TblMemberHistory с одним GroupID. Если требуется надежная схема, то потребуется разрулить блокировками. Но это уже тема для ветки по конкретной СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 09:22 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Senya_LИ даже если у мембера есть перерывы в участии в группе? Добавь в табличку "истории участия" запись с пустым Group_ID - получишь "просто выход их группы". Получить аналог EndDT можно запросом. Время на это конечно потратится... Но зато за целостностью данных следить не нужно. Сам запрос не привожу тут принципиально. Т.к. это не sqlный раздел. Если кото не может его придумать - прото выложите пример структуры и задайте этот вопрос в соответствующей ветке. Ответ не заставит себя ждать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 10:52 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Senya_LЯ бы только дополнил схему таким соглашением: если мембер в настоящий момент состоит в какой-то группе, то в EndDT содержится спец. значение (например, '30000101' - литерал для MSSQL). ППЦ! Senya_LИ еще EndDT включить в PK. И добавить контроль на непересекаемость интервалов в TblMemberHistory с одним GroupID. Если требуется надежная схема, то потребуется разрулить блокировками. Но это уже тема для ветки по конкретной СУБД. Выше всяких похвал! Но на деле имеет место. Встречал такое не раз... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 10:54 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsaSenya_LИ даже если у мембера есть перерывы в участии в группе? Добавь в табличку "истории участия" запись с пустым Group_ID - получишь "просто выход их группы". Вы тогда будете хранить переходы состояний. По сути, это другая модель данных, которая учитывает другие сущности. Это исключительно неудобно в плане получения состояния объекта в момент времени, поскольку в системе нет адекватных сущностей для решения этой задачи. Хранение (StartDT, EndDT) позволяет непосредственно получать интересующее нас состояние объекта. Для большего упрощения в EndDT вместо NULL лучше хранить самую большую дату. Тогда вам не придётся в ретроспективных запросах специально учитывать участия открытые на текущее время. Исключение EndDT ничем не упростит контроль целостности данных (в некоторых случаях даже усложнит), поскольку нет декларативных ограничений целостности, которые не позволят включить человека в команду дважды, или дважды исключить его или исключить из команды человека, который в ней никогда не состоял или сначала исключить чеолвека, а потом включить его в команду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 14:13 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsaSenya_LИ еще EndDT включить в PK. И добавить контроль на непересекаемость интервалов в TblMemberHistory с одним GroupID. Если требуется надежная схема, то потребуется разрулить блокировками. Но это уже тема для ветки по конкретной СУБД. Выше всяких похвал! Но на деле имеет место. Встречал такое не раз...Задумывались почему встречали "такое"? krvsaSenya_LЯ бы только дополнил схему таким соглашением: если мембер в настоящий момент состоит в какой-то группе, то в EndDT содержится спец. значение (например, '30000101' - литерал для MSSQL). ППЦ! Т.е. krvsa из г. Волжский - это авторитет, а профессор Снодграсс - так, пацан, мелкий ламерюга. Вот это действительно пипец. :) Кроме "пипцов" будет адекватная критика? krvsaSenya_LИ даже если у мембера есть перерывы в участии в группе? Добавь в табличку "истории участия" запись с пустым Group_ID - получишь "просто выход их группы". Получить аналог EndDT можно запросом. Время на это конечно потратится... Но зато за целостностью данных следить не нужно .Действительно, зачем??? Нехай нарушается. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 22:56 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36619736&tid=1542718]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
60ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 402ms |

| 0 / 0 |
