|
|
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Senya_LКроме "пипцов" будет адекватная критика? Ну извиняй, какая есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 09:38 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsaSenya_LКроме "пипцов" будет адекватная критика? Ну извиняй, какая есть. А у меня есть Твоя идея напоминает EAV, когда атрибуты сущности "размазаны" по нескольким строкам. Как правильно заметил mcureenab, контроль целостности ничем не проще. Простой пример: говоришь не требуется контроля целостности? Как бы не так! А проверку на двойное вхождение в одну и ту же группу? а те же самые проверки на непересекаемость интервалов членства в группе? А вот запросы на выборку однозначно станут сложнее. А то ж как все просто получается: убери EndDT, потому как оно не нравится krvsa, и будет тебе счастье :) ЗЫ. Так что аккуратнее с критикой, пожалуйста. Если не хотите прослыть злобным троллем, то высмеивание принято подверждать аргументами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 10:06 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Senya_LТак что аккуратнее с критикой, пожалуйста. Если не хотите прослыть злобным троллем, то высмеивание принято подверждать аргументами. Думай что хочешь... Это твоё право. Только наличие пресловутого поля EndDT только добавляет проблем с целостностью к тем проблемам что ты уже описал. Но в любом случае каждый будет решать для себя на чем ему остановиться. Т.ч. на один и тот же вопрос может быть несколько вариантов решения. Причем выбрать могут не самы лучший. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 14:31 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsa, EndDT нужен в любом случае, потому как участник может выйти из состава определенной группы и не принадлежать к какой-либо группе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 15:46 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbek , я уже описвал вариант как это сделать без EndDT... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 15:56 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Вот этот вариант... krvsaSenya_LИ даже если у мембера есть перерывы в участии в группе? Добавь в табличку "истории участия" запись с пустым Group_ID - получишь "просто выход их группы". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 15:58 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsaВот этот вариант... krvsaSenya_LИ даже если у мембера есть перерывы в участии в группе? Добавь в табличку "истории участия" запись с пустым Group_ID - получишь "просто выход их группы". ну а где хранить инфу когда именно он выходил из группы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:24 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbekну а где хранить инфу когда именно он выходил из группы? В StartDT конечно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 21:19 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsaorunbekну а где хранить инфу когда именно он выходил из группы? В StartDT конечно! krvsa, Для тебя повторю: meЗЫ. Так что аккуратнее с критикой, пожалуйста. Если не хотите прослыть злобным троллем, то высмеивание принято подверждать аргументами.Где аргументы, уважаемый? Советовать туфту и не подкреплять это аргументами - нефуево добрые советы. Вы не ответили про целостность данных, кстати ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 21:34 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Дабы показать свою точку зрения на хранение лично я взял бы вот какую структуру Таблица участниковКодпрочие поля/характеристики Таблица группКодпрочие поля/характеристики Таблица истории участияКодДатаКод участникаКод группы А использовать её или нет - решать конечному разработчику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 21:56 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Как примечание... При выходе изгруппы в таблице "истории участия" заполняются только первые 3 поля. Используя такую структуру я смогу получить все ответы на вопросы касающиеся членства в группах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 21:59 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsaКак примечание... При выходе изгруппы в таблице "истории участия" заполняются только первые 3 поля. Используя такую структуру я смогу получить все ответы на вопросы касающиеся членства в группах.Ты нее ответил на все вопросы. Например, о контроле целостности. Какие выгоды имеются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 00:15 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsano comment...Удобно, ничего не скажешь. Т.е. за свой "базар" отвечать неохота? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 01:00 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsaКак примечание... При выходе изгруппы в таблице "истории участия" заполняются только первые 3 поля. Используя такую структуру я смогу получить все ответы на вопросы касающиеся членства в группах.А как тут узнать, из какой группы вышел участник? Если он может участвовать в нескольких группах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 06:24 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsaКак примечание... При выходе изгруппы в таблице "истории участия" заполняются только первые 3 поля. Используя такую структуру я смогу получить все ответы на вопросы касающиеся членства в группах. он участвовал в группе A История участияУчастник ИвановГруппа А2010-05-01 Выходит из этой группы, что будет? Новая запись в эту таблицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 07:20 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
tanglirА как тут узнать, из какой группы вышел участник? Это делается запросом, по ближайшей дате, меньшей чем у "выходной" даты... tanglirЕсли он может участвовать в нескольких группах. Такой задачи вроде как не ставилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 08:33 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbekВыходит из этой группы, что будет? Новая запись в эту таблицу? Да. С "пустым" значением поля "Код группы". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 08:34 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
Senya_LТы нее ответил на все вопросы. Я вроде как и не обязан это делать... Если не нравится мой вариант структуры - я его и не навязываю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 08:36 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
krvsaorunbekВыходит из этой группы, что будет? Новая запись в эту таблицу? Да. С "пустым" значением поля "Код группы". Неее... не очень эффективный метод Лучше если будет столбец EndDT в котором если не NULL, скажем, то уже выход ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 08:45 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbekЛучше если будет столбец EndDT ... Каждый решает сам с чем ему работать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 09:26 |
|
||
|
Подскажите плиз
|
|||
|---|---|---|---|
|
#18+
orunbekНет, поэтому и такая структура: TblMembersIDGroup_ID - т.е. участник может быть членом только одной группы Если в каждый момент участник входит в одну группу, то Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Такая структура гарантирует, что участник в каждый момент времени входит в одну группу или не входит ни в одну из них (GROUP_ID - NULL). Если нужно также запретить переход из одной группы в нее же, то придется ввести фиктивную группу, а GROUP_ID включить в превичный ключ этой таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 12:46 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1542718]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
93ms |
get tp. blocked users: |
2ms |
| others: | 234ms |
| total: | 518ms |

| 0 / 0 |
