|
|
|
Теоретический вопрос
|
|||
|---|---|---|---|
|
#18+
Уважаемые знатоки! Хочу у вас совета спросить. стоит ли каждый раз заморачиваться с нормализацией баз данных? Что я имею в виду. Вот например, у меня есть одна таблица, содержащая общую информацию, а так же в ней имеется несколько полей, состоящих из кодов, которые соответствуют определенным значениям из справочника. Справочники служащих, справочники типов документов, справочники городов и т.п. Как правильнее делается? В главной таблице должны храниться коды из справочника? или соответствующее наименование из справочника? Если наименование , то в таком случае не надо будет писать большой запрос для связвания таблицы со справочником, т.к. значения справочников, а не кода будут в таблице. А если пользователь работает со справочником. Захочет удалить запись или изменить, то например, мне не нужно чтобы запись из главной таблицы, соответствующая удаленному или измененному значению из справочника тоже была удалена или изменена, или ссылалась на несуществующий код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2005, 16:20 |
|
||
|
Теоретический вопрос
|
|||
|---|---|---|---|
|
#18+
Вопрос поставлен неправильно. База данных должна быть нормализована всегда. Но, при определенных задачах, имеет смысл подумать о денормализации. Т.е. идти надо в противоположную сторону. "Писать большой запрос" - это один из аргументов, который может являться причиной денормализации. Но подобную проблему надо очень тщательно продумывать. Из нормализованной базы сделать ненормализованную очень просто, а вот обратный процесс, зачастую невозможен. Насчет удаления ссылок - это вопрос целостности базы данных и к нормализации вообще-то имеет весьма косвенное отношение. Например, если у тебя все тот же справочник, но в основной таблице храниться не код записи из справочника, а название. И ты удаляешь запись справочника. Ведь все-равно встанет вопрос, что делать с записью в основной таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2005, 17:51 |
|
||
|
Теоретический вопрос
|
|||
|---|---|---|---|
|
#18+
Разумеется, база данных должна быть приведена к 3N форме (3-я нормальная форма). Другое дело, что "нормальная" база данных очень неэффективна для извлечения данных при выполнении сложных аналитических запросах - операция JOIN "дорогая" для любого сервера баз данных (и даже MERGE JOIN не всегда помогает). Выхода два: 1. Самое эффективное, это оставить "Кесареву - кесарево"...т.е. для заполнение данных использовать реляционную базу данных, а для анализа, использовать OLAP решения и "загонять" данные в, например, Analysis Services (тем более он идет в поставки к SQL Server) и создавать объекты типа OLAP Cube, специально предназначенные для анализа больших объемах данных. 2. Частично денормализовать базу данных с целью уменьшения числа JOIN в SELECT-ах, но это путь опасный и трудный - придется решать проблему, как справедливо отметил ВладимирМ, обновления в таблицах фактах при обновлении данных в справочниках. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2005, 21:16 |
|
||
|
Теоретический вопрос
|
|||
|---|---|---|---|
|
#18+
ВладимирМНапример, если у тебя все тот же справочник, но в основной таблице храниться не код записи из справочника, а название. И ты удаляешь запись справочника. Ведь все-равно встанет вопрос, что делать с записью в основной таблице. В том то и дело, что я столкнулась с проблемой. Создала базу по всем правилам нормализации. А оказалось, что не стоило так делать. Например, при обновлении данных в справочниках (переименование, удаление) записи в основной таблице, касающиеся информации из справочника никак не должны меняться. И что делать? Разнормализировать? И еще вопрос, зачем создавать связи между таблицами непосредственно в конструкторе БД? Если можно в ДЕ форме указать эти связи, или вообще, работать с курсором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2005, 22:16 |
|
||
|
Теоретический вопрос
|
|||
|---|---|---|---|
|
#18+
Krushinskaya Olga...В том то и дело, что я столкнулась с проблемой. Создала базу по всем правилам нормализации. А оказалось, что не стоило так делать. Например, при обновлении данных в справочниках (переименование, удаление) записи в основной таблице, касающиеся информации из справочника никак не должны меняться. И что делать? Разнормализировать?Нет!!! Надо просто объяснить пользователям, что при переименовании информации в справочнике, как бы сразу изменится информация в основной таблице, а при удалении записи из справочника, могут удалиться записи в основной или потеряется целосность информации (это как вы спрограммируете). А чтобы избежать обновления данных в справочнике , вообще-то вводят новую запись в справочник и работаю теперь с этой записью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2005, 15:13 |
|
||
|
Теоретический вопрос
|
|||
|---|---|---|---|
|
#18+
Krushinskaya OlgaВ том то и дело, что я столкнулась с проблемой. Создала базу по всем правилам нормализации. А оказалось, что не стоило так делать. Например, при обновлении данных в справочниках (переименование, удаление) записи в основной таблице, касающиеся информации из справочника никак не должны меняться. И что делать? Разнормализировать? Опять, это другая задача. Не имеющая отношения к нормализации. Я так понимаю, что речь идет о неких выходных (бумажных) формах (акты, накладные, счета-фактур и т.п). Некий контрагент раньше имел одно название, а затем был переименован. Но все старые документы должны остаться со старым названием. Проблема здесь в следующем. Если ты сделаешь привязку "по значению", т.е. в сам документ вставишь название контрагента, а не его код, то ты никогда не получишь баланс, полную отчетность, по этому контрагенту. Ты просто не найдешь части документов. Существуют 2 стратегии решения данной проблемы: Создавать отдельную таблицу (или директорию) для хранения распечатанных документов. Т.е. вот распечатали документ, делается ее копия, например, в формате PDF. И если возникает необходимость распечатать ее "задним" числом, то берем этот файл из архива и печатаем. А что там есть сейчас в базе нас уже не интересует. Недостаток такой стратегии очевиден - слишком много лишних файлов. Придется сохранять копии после каждой печати документа. Ведь неизвестно в какой имеенно момент произайдет замена реквизита. Создавать историю реквизитов. Это уже требует более сложного программирования. Для каждого такого реквизита заводится дополнительная таблица, где хранится его значение и период действия. Например, один и тот же контрагент с 01.01.2000 по 01.01.2005 назывался "Рога и Копыта", а начиная с 02.01.2005 - "Копыта и Рога". Вот в этой отдельной таблице и делаем дополнительную запись для "архивных" значений. Текущие значения оставляем в самом справочнике. Когда возникает необходимость печатать документ задним числом, то смотрим, есть ли за указанную дату запись в истории реквизита. Если есть, то ее и используем вместо текущего значения. Такая стратегия используется в 1С. На всякий случай повторюсь: хранится история не для всей записи справочника, а для значений его отдельных полей. Тут надо серьезно подойти к вопросу, какие именно реквизиты "заслуживают" своей истории. Krushinskaya OlgaИ еще вопрос, зачем создавать связи между таблицами непосредственно в конструкторе БД? Если можно в ДЕ форме указать эти связи, или вообще, работать с курсором. Это разные типы связи. У них разное назначение. Подробнее об этом почитай здесь Связи и отношения между таблицами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2005, 19:25 |
|
||
|
|

start [/forum/topic.php?fid=41&gotonew=1&tid=1592713]: |
0ms |
get settings: |
7ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
13ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 356ms |

| 0 / 0 |
