|
|
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Собраны подходы к хранению хронологических данных http://www.arbinada.com/modules.php?name=News&file=article&sid=91 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 16:22 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Я бы хранил каждый периодический реквизит в отдельной таблице вида Реквизит(ДатаНачала, ДатаОкончания, IDРодителя, Значение) Если ДатаОкончания не указана, значит ее или нет, или это ДатаНачала следующего значения минус 1 день (час/минута/секунда зависит от задач). Например, Клиент(Ид, НепериодическиеАтрибуты) НДС(ДатаНачала, ДатаОкончания, ИдКлиента, Значение) - история работы клиентов с НДС (являлись плательщиками, не являлись). Договора(ИдДоговора, ИдКлиента, ПрочиеАтрибуты) - история договоров (кто-то может сказать, что это не история, а простой справочник договоров, но я отвечу, что в данном случае это одно и то же, ведь договора тоже заключаются на временной шкале, значит имеет место история), в ПрочихАтрибутах я скрыл даты. Почему мы не включаем все (!) атрибуты договоров сразу в справочник Клиентов? Потому что есть понятие нормализации, и мне даже в голову не приходит складывать все в одну таблицу. А разделяя отношения на более мелкие таблицы мы уходим от избыточности (в справочнике Клиентов лежат данные только о клиентах, записанные единожды и не повторяющиеся из кортежа в кортеж). Уж не знаю сколько милисекунд мы потеряем на соединениях, однако красота схемы заставит нас впасть в нирвану. Почему бы я выбрал хранение каждого вида реквизита в отдельной таблице? Люблю порядок. Любая сущность реального мира должна быть представлена отдельной сущностью базы данных. И если я захочу выбрать НДС, то посмотрю нужное значение в таблице НДС. А вообще тут зависит от предметной области. Если периодических атрибутов слишком много, то возможно и правда удобнее хранить их в одной таблице, чтобы не загромождать схему, выставив предварительно в отношении признак ТипАтрибута (правда тогда надо будет еще сделать справочник ТипыАтрибутов, опять же чтобы избыточность не плодить). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 23:38 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
NFЕсли ДатаОкончания не указана, значит ее или нет, или это ДатаНачала следующего значения минус 1 день (час/минута/секунда зависит от задач). Будь проще. Прикинь как будут выглядеть SQL запросы со всеми этими заморочками! Заколебёшься предикаты выписывать. NFПотому что есть понятие нормализации Нормализация тут не при чём. Ты предлагаешь заменить большой повторяющийся блок данных коротким числом. Это не есть нормализация, поскольку эта процедура не имеет цели устранить какую либо функциональную зависимость. Это кодирование данных с целью уменьшения занимаемого ими объёма памяти и не более того. NFоднако красота схемы заставит нас впасть в нирвану. Боюсь, от такой красоты в нирвану впадёт СУБД и будет в ней пребывать неопределённо долго. NFЕсли периодических атрибутов слишком много, то возможно и правда удобнее хранить их в одной таблице, чтобы не загромождать схему, выставив предварительно в отношении признак ТипАтрибута (правда тогда надо будет еще сделать справочник ТипыАтрибутов, опять же чтобы избыточность не плодить). Это EAV со всеми вытекающими последствиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2007, 16:38 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
NFПочему бы я выбрал хранение каждого вида реквизита в отдельной таблице?Про хранение в одной таблице и в многих таблицах - много было сказано здесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2007, 17:02 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
izoldov-roskini<...>1. Все хранить в один столбец с указанием id-реквизита, дата, значение (недостаток, чтобы получить строку со всеми реквизитами, нужно выполнить n-число запросов); Я когда-то использовал именно этот способ. Причём без даты "до". Вполне прилично работало. izoldov-roskini 2. Хранить все ревизиты как колонки отдельной таблицы id,дата, рекв1,.... рекв-n.( недостаток, увеличение кол-ва данных, если пользователь меняет один реквизит на новую дату, то должны взяться последние до этой даты и продублироваться, зато скорость выше, 1-запрос - вся строка с реквизитами). <...> Если количество и состав реквизитов изначально известны, а реквизиты изменяются все вместе, как курсы валют ММВБ - хороший способ. Если не все вместе, часто, да ещё и количество и состав их изменяется - так себе способ, таблица будет быстро расти. Хотя, учитывая современное железо и СУБД, система даже таким способом сможет хранить информацию за достаточно длительный период времени, может, этого для решения Вашей задачи вполне достаточно. А вообще Вам нужно поискать по словам "хранение темпоральных данных", "темпоральные БД". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2007, 13:19 |
|
||
|
|

start [/forum/topic.php?fid=32&startmsg=34620660&tid=1544428]: |
0ms |
get settings: |
8ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
111ms |
get topic data: |
18ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 264ms |
| total: | 513ms |

| 0 / 0 |
