powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Теоретический вопрос
6 сообщений из 6, страница 1 из 1
Теоретический вопрос
    #33454921
Krushinskaya Olga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые знатоки! Хочу у вас совета спросить. стоит ли каждый раз заморачиваться с нормализацией баз данных?
Что я имею в виду. Вот например, у меня есть одна таблица, содержащая общую информацию, а так же в ней имеется несколько полей, состоящих из кодов, которые соответствуют определенным значениям из справочника. Справочники служащих, справочники типов документов, справочники городов и т.п.
Как правильнее делается? В главной таблице должны храниться коды из справочника? или соответствующее наименование из справочника?
Если наименование , то в таком случае не надо будет писать большой запрос для связвания таблицы со справочником, т.к. значения справочников, а не кода будут в таблице.
А если пользователь работает со справочником. Захочет удалить запись или изменить, то например, мне не нужно чтобы запись из главной таблицы, соответствующая удаленному или измененному значению из справочника тоже была удалена или изменена, или ссылалась на несуществующий код.
...
Рейтинг: 0 / 0
Теоретический вопрос
    #33455172
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос поставлен неправильно.

База данных должна быть нормализована всегда. Но, при определенных задачах, имеет смысл подумать о денормализации.

Т.е. идти надо в противоположную сторону.

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

Насчет удаления ссылок - это вопрос целостности базы данных и к нормализации вообще-то имеет весьма косвенное отношение.

Например, если у тебя все тот же справочник, но в основной таблице храниться не код записи из справочника, а название. И ты удаляешь запись справочника. Ведь все-равно встанет вопрос, что делать с записью в основной таблице.
...
Рейтинг: 0 / 0
Теоретический вопрос
    #33455403
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумеется, база данных должна быть приведена к 3N форме (3-я нормальная форма). Другое дело, что "нормальная" база данных очень неэффективна для извлечения данных при выполнении сложных аналитических запросах - операция JOIN "дорогая" для любого сервера баз данных (и даже MERGE JOIN не всегда помогает). Выхода два:
1. Самое эффективное, это оставить "Кесареву - кесарево"...т.е. для заполнение данных использовать реляционную базу данных, а для анализа, использовать OLAP решения и "загонять" данные в, например, Analysis Services (тем более он идет в поставки к SQL Server) и создавать объекты типа OLAP Cube, специально предназначенные для анализа больших объемах данных.
2. Частично денормализовать базу данных с целью уменьшения числа JOIN в SELECT-ах, но это путь опасный и трудный - придется решать проблему, как справедливо отметил ВладимирМ, обновления в таблицах фактах при обновлении данных в справочниках.

С уважением, Алексей
...
Рейтинг: 0 / 0
Теоретический вопрос
    #33455455
Krushinskaya Olga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМНапример, если у тебя все тот же справочник, но в основной таблице храниться не код записи из справочника, а название. И ты удаляешь запись справочника. Ведь все-равно встанет вопрос, что делать с записью в основной таблице.

В том то и дело, что я столкнулась с проблемой. Создала базу по всем правилам нормализации. А оказалось, что не стоило так делать. Например, при обновлении данных в справочниках (переименование, удаление) записи в основной таблице, касающиеся информации из справочника никак не должны меняться. И что делать? Разнормализировать?

И еще вопрос, зачем создавать связи между таблицами непосредственно в конструкторе БД? Если можно в ДЕ форме указать эти связи, или вообще, работать с курсором.
...
Рейтинг: 0 / 0
Теоретический вопрос
    #33455839
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Krushinskaya Olga...В том то и дело, что я столкнулась с проблемой. Создала базу по всем правилам нормализации. А оказалось, что не стоило так делать. Например, при обновлении данных в справочниках (переименование, удаление) записи в основной таблице, касающиеся информации из справочника никак не должны меняться. И что делать? Разнормализировать?Нет!!! Надо просто объяснить пользователям, что при переименовании информации в справочнике, как бы сразу изменится информация в основной таблице, а при удалении записи из справочника, могут удалиться записи в основной или потеряется целосность информации (это как вы спрограммируете). А чтобы избежать обновления данных в справочнике , вообще-то вводят новую запись в справочник и работаю теперь с этой записью.
...
Рейтинг: 0 / 0
Теоретический вопрос
    #33455995
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Krushinskaya OlgaВ том то и дело, что я столкнулась с проблемой. Создала базу по всем правилам нормализации. А оказалось, что не стоило так делать. Например, при обновлении данных в справочниках (переименование, удаление) записи в основной таблице, касающиеся информации из справочника никак не должны меняться. И что делать? Разнормализировать?
Опять, это другая задача. Не имеющая отношения к нормализации. Я так понимаю, что речь идет о неких выходных (бумажных) формах (акты, накладные, счета-фактур и т.п). Некий контрагент раньше имел одно название, а затем был переименован. Но все старые документы должны остаться со старым названием.

Проблема здесь в следующем.

Если ты сделаешь привязку "по значению", т.е. в сам документ вставишь название контрагента, а не его код, то ты никогда не получишь баланс, полную отчетность, по этому контрагенту. Ты просто не найдешь части документов.

Существуют 2 стратегии решения данной проблемы:

Создавать отдельную таблицу (или директорию) для хранения распечатанных документов.

Т.е. вот распечатали документ, делается ее копия, например, в формате PDF. И если возникает необходимость распечатать ее "задним" числом, то берем этот файл из архива и печатаем. А что там есть сейчас в базе нас уже не интересует.

Недостаток такой стратегии очевиден - слишком много лишних файлов. Придется сохранять копии после каждой печати документа. Ведь неизвестно в какой имеенно момент произайдет замена реквизита.


Создавать историю реквизитов.

Это уже требует более сложного программирования. Для каждого такого реквизита заводится дополнительная таблица, где хранится его значение и период действия.

Например, один и тот же контрагент с 01.01.2000 по 01.01.2005 назывался "Рога и Копыта", а начиная с 02.01.2005 - "Копыта и Рога".

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

Когда возникает необходимость печатать документ задним числом, то смотрим, есть ли за указанную дату запись в истории реквизита. Если есть, то ее и используем вместо текущего значения.

Такая стратегия используется в 1С.

На всякий случай повторюсь: хранится история не для всей записи справочника, а для значений его отдельных полей. Тут надо серьезно подойти к вопросу, какие именно реквизиты "заслуживают" своей истории.

Krushinskaya OlgaИ еще вопрос, зачем создавать связи между таблицами непосредственно в конструкторе БД? Если можно в ДЕ форме указать эти связи, или вообще, работать с курсором.
Это разные типы связи. У них разное назначение.

Подробнее об этом почитай здесь

Связи и отношения между таблицами
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Теоретический вопрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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