|
|
|
Проектирование хранилища данных - внешние ключи на измерения
|
|||
|---|---|---|---|
|
#18+
Проектируется база данных из разряда хранилищ. В базе будет храниться большое количество записей - фактов. Каждый факт имеет время своего совершения. И есть таблицы справочников. Каждая запись в справочнике имеет ограниченное время действия (поля start_date, end_date). Справочники используются для заполнения некоторых полей таблицы фактов и затем используются в аналитике. При заполнении полей факта, записи в справочниках ищутся по именам и времени действия. Рассматривается два варианта: 1. В таблицу фактов вставляются имена из справочников, а не значения ключа. И если в аналитическом запросе будет нужно соединить таблицу фактов и таблицу справочника, то соединение будет делаться через имя и время действия. Плюсом здесь приводится независимость таблицы фактов от справочников и возможность выполнения части аналитических запросов без обращения к таблицам справочников. 2. В таблицу фактов вставляются значения внешних ключей (числовых) на справочники. Я за второй вариант, но пока не могу убедить до конца в этом архитектора. Его аргументы - что часть запросов (которые уже известны на сегодня) будет выполняться без обращений к справочникам или с минимумом обращений, не в пример моему варианту, когда каждый запрос содержит обращение к справочнику. Ещё один его аргумент - факты положенные в хранилище должны быть неизменны. Если запись в справочнике изменят, то изменится и факт, ссылающийся на эту запись. Имеет ли смысл в каких то случаях первый вариант? В будущем будут появляеться новые аналитические запросы. Размеры данных: фактов миллиарды, возможно десятки миллиардов. Справочников порядка восьми, записей в них десятки, тысячи, десятки тысяч. БД - Oracle. Таблица фактов секционирована по месяцам (факты хранятся за три года). Большинство аналитических запросов строится в пределах секции (месяца). Заранее всем благодарен за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 13:29 |
|
||
|
Проектирование хранилища данных - внешние ключи на измерения
|
|||
|---|---|---|---|
|
#18+
А денормализовать стправочники так, чтобы избежать наличия dt_start, dt_end никак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 13:45 |
|
||
|
Проектирование хранилища данных - внешние ключи на измерения
|
|||
|---|---|---|---|
|
#18+
Пусть подумает о занимаемом фактом месте на диске. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: plaintext 1. 2. 3. 4. Т.е. на одно поле на таблице с миллиардом записей - 14 Gb. Причем длина Name взята достаточно маленькой. С учетом RAID одно поле = 30 гигам. Прибавляем размеры индексов - еще 30 гигов. Итого - одно поле равно хорошему винту SCSI. P.S. Индексы, если Вы, конечно, не хотите любой запрос делать с помощью полного доступа к партиции - т.е. у вас простенький OLAP. -- Теперь вспоминаем, что такое "нормализация" и какие глюки можно словить при варианте архитектора (изменение названия в справочнике)... -- Короче, того человека, который пытается быть архитекторм у Вас, надо уволить к чертовой бабушке. И нанять меня k_iv(собака)inbox(точка)ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 13:45 |
|
||
|
Проектирование хранилища данных - внешние ключи на измерения
|
|||
|---|---|---|---|
|
#18+
Не представляю, как можно денормализовать справочники, чтобы избавиться от start/end_date. Что вообще имеется в виду? Сейчас подразумеватся - появляется новый филиал в справочнике. Заводится запись в таблице филиалов со значением start_date=время открытия филиала. Год работает, потом закрывается. Или изменяются свойства филиала - это значит что реально в справочнике старый филиал будет закрыт датой end_date и создан новый с таким же именем. Чтобы факты того старого филиала с его свойствами так и ссылались на тот старый филиал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 14:02 |
|
||
|
Проектирование хранилища данных - внешние ключи на измерения
|
|||
|---|---|---|---|
|
#18+
junixarЯ за второй вариант, но пока не могу убедить до конца в этом архитектора. Жуть. Выкиньте нафиг такого архитектора. Начальству объясните, что: 1. Если в таблицу фактов положить 10 строк в среднем по 30 символов, размер записи вырастет байт на 250, размер таблицы с миллиардом записей - примерно на 230 гигабайт. Кроме того, эти данные должны быть проиндексированы и хорошо проиндексированы, так что считайте терабайт занят хрен знает чем. Влияние этого на скорость выполнения запросов вполне предсказуемо; дисковый ввод, необходимый для выполнения запроса, вырастет в N раз, и это перекроет любую выгоду от такой денормализации. 2. Схема номер 1 отправляется в глубокую задницу как только возникает необходимость поменять "имя" из справочника. А такая необходимость возникает всегда. 3. При таких соотношениях справочники будут безвылазно сидеть в оперативке и довольно быстро линковаться к фактам. Кроме того, Oracle специально позаботился о star transformation и других фичах, ориентированных именно на схему "вариант 2". 4. Линковка по "строке и дате из диапазона" операция куда более напрягающая, нежели по id. Даже если предположить, что денормализация переноса "имени" осмысленна, тем не менее в таблице фактов нужно держать и нормальный id. junixarЕщё один его аргумент - факты положенные в хранилище должны быть неизменны. Если запись в справочнике изменят, то изменится и факт, ссылающийся на эту запись. Это софизм, опирающийся на полуправду. Факты не "должны быть неизменны". Факты "как правило не меняются", поскольку они уже свершились, и это факт. Факты могут меняться - и меняются - в том случае, если при вводе была допущена ошибка; в этом случае они меняются и в учетной системе, и в хранилище (*). Теперь про изменение справочников. Изменение данных SCD2-справочника - это вставка в него новой записи с новым периодом действия и новым ключом. Старые факты при этом не меняются, поскольку продолжают ссылаться на старые записи справочника. Новые записи фактов могут (и скорее всего, должны) ссылаться на новые записи справочника. junixarИмеет ли смысл в каких то случаях первый вариант? Позволю себе сослаться на авторитет фирмы Oracle, выдавшей мне сертификат на чтение авторизованных курсов по DWH. Так вот, в их курсах этот вариант не рассматривается. (*) Тут есть один тонкий момент: нужно отличать "ошибочно введенный факт" от "факта, свидетельствующего об ошибке". Например, если милиционер выдал Вам паспорт с номером А, а в БД вбил паспорт с номером Б, это ошибка, и она должна быть исправлена - отражая тот факт, что Вы реально все время носили в кармане паспорт номер А. Если же он должен был выдать паспорт номер А, но ошибся и использовал бланк с номером Б, это свершившийся факт, который в точности должен быть отражен в хранилище. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 14:07 |
|
||
|
Проектирование хранилища данных - внешние ключи на измерения
|
|||
|---|---|---|---|
|
#18+
softwarer Позволю себе сослаться на авторитет фирмы Oracle, выдавшей мне сертификат на чтение авторизованных курсов по DWH. Так вот, в их курсах этот вариант не рассматривается. Можно прямо в справочник идеоматических выражений в расшифровку фразы "давить авторитетом" А что такое SCD2-справочник? И чем он отличается от SCD1? Что-то не нагуглил особо внятного объяснения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 18:38 |
|
||
|
Проектирование хранилища данных - внешние ключи на измерения
|
|||
|---|---|---|---|
|
#18+
RA\/ENМожно прямо в справочник идеоматических выражений в расшифровку фразы "давить авторитетом" :) RA\/ENА что такое SCD2-справочник? И чем он отличается от SCD1? Признаться, я считаю эту классификацию существенно неполной, но ничего лучшего не знаю. Отличается же тем, что SCD1 не поддерживает историю, а SCD2 поддерживает. Если неформально, то Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2006, 21:17 |
|
||
|
Проектирование хранилища данных - внешние ключи на измерения
|
|||
|---|---|---|---|
|
#18+
junixarНе представляю, как можно денормализовать справочники, чтобы избавиться от start/end_date. Что вообще имеется в виду? Сейчас подразумеватся - появляется новый филиал в справочнике. Заводится запись в таблице филиалов со значением start_date=время открытия филиала. Год работает, потом закрывается. Или изменяются свойства филиала - это значит что реально в справочнике старый филиал будет закрыт датой end_date и создан новый с таким же именем. Чтобы факты того старого филиала с его свойствами так и ссылались на тот старый филиал. Вообще смутился... Я не понял - у Вас первичны факты или справочники?! Предположим, РЕАЛЬНО открылся какой-то филиал в феврале... А закрылся так же РЕАЛЬНО в августе. Скажите тогда - откуда у Вас в Хранилище могут быть данные за январь или ноябрь, например??? Тогда с какого перепуга нужно связывать факты с тем же справочником не только по ключу склада, но и по дате факта/периоду работы склада? Или Вам хочется проверить сервер на предмет производительности при обработке ненужных условий? Например, у меня возникает необходимость хранить некоторые исторические признаки. Именно через даты начала и конца действия признака (например, цена товара). Но для этого я использую отдельные таблицы, где хранится ссылка на товар, цена и ее период действия. Но это вызвано только тем, что, например, нужно просуммировать продажи за период, расценив их по данной цене. И эти справочники используются не всегда, а только если интересует цена... У нас когда-то была ситуация, когда при изменении одного из параметров справочника просто создавалась новая запись - и все новые факты ссылались уже на нее. Но и здесь период действия нужен только в момент загрузки данных для корректной привязки к справочникам, но не при снятии отчетов. Не зная Вашей специфики, ничего утверждать не возьмусь - но у нас этот подход себя не оправдал. Остановились на отдельном хранении изменяющихся фактов с указанием периодов действия. Тоже есть свои минусы - но пока работает. Возможно, Вы просто привели неверный пример - не буду спорить. Но выбранный пример я абсолютно не понял! Насчет постоянности фактов Вам уже говорили. В Хранилищах требуется больше аналитика, а не 100%ное соответствие каким-то печатным документам. Приведу гипертрофированный пример, но все же... Предположим, у Вас был склад. Назывался "Крайний Север". Но потом Вы открыли склад еще севернее - в связи с чем пришла необходимость переименовать существующий склад просто в "Север" (пусть даже имя нового склада будет "Крайнейший Север", т.е. не совпадет с использованными раньше). Тогда при модели Вашего архитектора в аналитике Вы получите, что был склад "Крайний Север", потом вдруг исчез, но появился склад "Север". Соответственно, продажи за период по этому ФИЗИЧЕСКОМУ складу будут биться по двум "виртуальным" и т.п. И у Вас тогда есть очень "нетрудоемкий" выход - обновлять всю таблицу фактов. А при использовании справочника Вы бы могли изменить ТОЛЬКО название в справочнике! Более того - при желании сохранить исторические данные в справочник можно добавить поле типа "старое название склада". Добавлять такое же в факты - не хватит дисков. А как уже сказал softwarer - необходимость что-то изменить возникает ВСЕГДА. И присоединюсь к общему мнению о странном выборе архитектора для задачи такого масштаба. Пусть это IMHO, но Вы задумайтесь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2006, 19:27 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33926265&tid=1545089]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
168ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 484ms |

| 0 / 0 |
