Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос теории
|
|||
|---|---|---|---|
|
#18+
Проектируем базу. Вопрос более теоретический, чем практический. Есть таблица студентов. Они могут перемещаться между группами на оснавании приказов, а также могут отчисляться/заканчивать и восстанавливаться в любой группе. Соответственно для этого есть таблица групп. Приказ на перемещение формируется для множество студентов, а также требуется, чтобы приказ можно было "откатить", а при случае снова активировать("накатить"). Для этого формирую таблицу приказов и еще одну таблицу для списка студентов, входящих в приказ. При активации приказа(т.к. сказать формирование проводки) в зависимости от его типа формирую, либо обновляю строку перемещения в таблице перемещений. Таблица перемещений выглядит следующим образом: ID | Grp | StartDate | EndDate | IDorder1 | IDOrder2 ID - первичный ключ Grp - группа в которую перемещен студент StartDate - дата с которой он находится в этой группе EndDate - дата до которой он находится в этой группе IDOrder1 - на основании какого приказа он зачислен IDOrder2 - на основании чего выбыл Соответственно есть 3 типа приказов: 1 - на зачисление( формируют новую строку в таблице перемещений и заполняют поле StartDate, IDOrder1) 2 - на перемещение( проставляют IDOrder2 и EndDate в строке предыдущего перемещения и формируют как и в 1 случае ) 3 - на отчисление( проставляют IDOrder2 и EndDate в строке предыдущего перемещения ) Такая схема обеспечивает то, что на любую дату можно однозначно, без дополнительных вычислений узнать в какой группе находился студент из соотношения( StartDate<= Date <= EndDAte). Мой коллега однако не согласен с такой структурой и считает, что на каждый приказ должна быть заведена отдельная строка в таблице перемещений, а таблица студентов учавствующих в приказе вовсе не нужна, так как это дубляж данных. что можете посоветовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2005, 07:51 |
|
||
|
Вопрос теории
|
|||
|---|---|---|---|
|
#18+
И еще один: каким нормальным формам соответствует первый вариант, а то у нас по этому вопросу тоже споры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2005, 07:52 |
|
||
|
Вопрос теории
|
|||
|---|---|---|---|
|
#18+
Вообще то вопросы проектирования баз здесь обсуждаются в специальном форуме - Проектирование БД . Может переедем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2005, 07:55 |
|
||
|
Вопрос теории
|
|||
|---|---|---|---|
|
#18+
Просмотрел. Переедем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2005, 07:56 |
|
||
|
Вопрос теории
|
|||
|---|---|---|---|
|
#18+
Если есть функциональная зависимость IDorder1 -> StartDate или IDOrder2 -> EndDate, то нарушена 2-я норм. форма ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2005, 10:57 |
|
||
|
Вопрос теории
|
|||
|---|---|---|---|
|
#18+
Получается, что да, вторая форма нарушена, т.к. StartDate, EndDate это поля из таблицы приказов. Чтобы нормализовать таблицу, в ней надо оставить только номера приказов, а для отображения создать представление. С другой стороны в эту таблицу доступ обеспечен только хранимыми процедурами, с строгими параметрами, т.е. доступ пользователей(ручной) исключен. Есть ли смысл в нормализации или все-таки переходить к использованию представлений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2005, 11:08 |
|
||
|
Вопрос теории
|
|||
|---|---|---|---|
|
#18+
Если поля оставить - неизбежны аномалии обновления - придется синхронно изменять поле Date в основной таблице и табл. приказов. Дело ваше, но я бы нормализовал это дело ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2005, 11:14 |
|
||
|
Вопрос теории
|
|||
|---|---|---|---|
|
#18+
Если приказ активен, то удалить или изменить записи в таблице перемещений нельзя, а если не активен, то записей в таблице перемещений быть не должно. У кого есть какой подобный опыт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2005, 11:24 |
|
||
|
Вопрос теории
|
|||
|---|---|---|---|
|
#18+
Infernal V. RavenЕсли приказ активен, то удалить или изменить записи в таблице перемещений нельзя, а если не активен, то записей в таблице перемещений быть не должно. У кого есть какой подобный опыт? Стандартный подход в любой учетной/бухгалтерской системе, а в чем вопрос? P.S. Кстати есть такое понятие как сторнирование перемещений (проводок) это когда приказ был отменен, но студент числился в другой группе некоторое время. Т.е. при отмене приказа не удаляется перемещение а создается новая запись в таблице перемещений возвращающая студента обратно но другой датой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2005, 11:56 |
|
||
|
Вопрос теории
|
|||
|---|---|---|---|
|
#18+
Про сторно - спасибо, забыл. Вопрос таки, нормализовать или нет таблицу перемещений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2005, 12:00 |
|
||
|
Вопрос теории
|
|||
|---|---|---|---|
|
#18+
Данная таблица, как можно понять, является вычисляемой, и служит для ускорения запросов. Нормализация здесь ни причем - с точки зрения нормализации она целиком лишняя. Так что вопрос не теоретический а скорее практический - насколько издержки по ведению таблицы перекрываются выигрышем при запросах. На взгляд, таблица еще может быть полезна для ускорения некоторых проверок - например, не откатывать приказ IDorder1 если не пуст IDOrder2. Если допускает применяемая СУБД, то можно сделать ее материализованным представлением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2005, 11:29 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33268218&tid=1545671]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 383ms |

| 0 / 0 |
