Хранилище данных: хеш-ключи в промежуточной таблице - дополнительно

Я изучаю использование методологии datavault 2.0. Я понимаю причины хеширования и пытаюсь его применить. Я хотел бы применить это на этапе «постановки» хранилища данных, а не загружать его в DV.

Если в таблице есть бизнес-ключ, то его легко просто применить к этой таблице (возможно, она станет концентратором). Но есть таблицы, такие как «orderdetail» (которые, вероятно, становятся ссылками), которые имеют несколько ссылок на другие элементы через суррогатный ключ.

Должна ли промежуточная таблица содержать как суррогатную последовательность для каждого внешнего ключа, так и хэш для указанного объекта BK?

Пример: если у меня есть таблица заказов с суррогатной последовательностью customerId, но в таблице клиентов есть ссылка CUST-000xxx, которая используется в качестве BK, должен ли я выполнить «соединение» между заказом и клиентом, чтобы разрешить «CUST-000xxx» чтобы я мог его хешировать и включить в промежуточную таблицу заказа?

Я думал, что это потенциально может быть решено при загрузке данных в DV из промежуточной области, но ссылка на клиента может не существовать в промежуточной области в тот конкретный момент времени, потому что заказ может быть просто новым заказом для существующий клиент, который не изменился.

DV 2.0 указывает, что вся эта работа с хешами делается для повышения производительности и простой параллельной загрузки данных без дорогостоящих поисков в самом DV. Отсюда вопрос, как это обычно решается.

Пример добавлен сюда:

order - orderid - customerid - order_ref - идентификатор продавца

клиент - customerid - customer_ref

person - personid - full_name - логин

Чтобы заполнить порядок, я должен выполнить соединение в исходной базе данных следующим образом:

SELECT
   hash_func(o.order_ref) as hash_key_order,
   hash_func(c.customer_ref) as hash_key_customer,
   hash_func(p.login) as hash_key_person,
   o.orderid, 
   c.customerid,
   p.login
FROM
   order o inner join customer c on o.customerid = c.customerid
   inner join person p on o.salespersonid = p.personid

или это разрешение для внешних ключей, разрешенное в хранилище данных, поэтому запрос проще, например:

SELECT
   hash_func(o.order_ref) as hash_key_order,
   o.orderid, 
   c.customerid,
   p.personid
FROM
   order o

Мне это непонятно. Насколько я понимаю, путем хеширования можно избежать дорогостоящих поисков, поэтому отсутствие генерации хэша при постановке для внешних ключей в противном случае не повлияет на производительность?


person radialmind    schedule 13.02.2018    source источник
comment
Мне кажется, что это скорее проблема бизнес-правил, чем загрузка. Если это так, то как сейчас решается проблема с пустой ссылкой в ​​реальном бизнесе? Как они обрабатывают пустые ключи с новыми заказами или неизменным клиентом. Мне кажется, что применяется только часть Data Vault. Возможно, расширите вопрос фактическими данными строки, чтобы сделать его более понятным.   -  person tobi6    schedule 14.02.2018
comment
Я добавил пример, чтобы прояснить ситуацию.   -  person radialmind    schedule 15.02.2018


Ответы (2)


Я не совсем уверен, зачем нужен сложный оператор SELECT для заполнения порядка. Также я думаю, что может быть некоторая путаница в парадигмах Data Vault. Что вы хотите делать с Data Vault, так это читать все данные из исходных систем.

Это означает, что сначала вы должны загрузить таблицу Order в основной DWH, который, похоже, смоделирован с помощью Data Vault. Затем вы должны сделать то же самое с Customer, Person и так далее. Вплоть до тех пор, пока все данные, которые вам понадобятся позже для работы вашего отчета, не будут находиться в основном DWH.

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

Теперь, когда все загружено в Data Vault, вы можете воссоздать свое бизнес-правило поверх данных. Это означает, что если вы используете суррогатные ключи, вам может потребоваться их воссоздать. Если суррогатные ключи заранее созданы в базе данных и представляют ценность для бизнеса, возьмите их.

Но это зависит от использования идентификаторов. Как я уже говорил ранее, вам сначала нужно знать, как бизнес обрабатывает предоставленные вами кейсы. Затем вы загружаете все данные в Data Vault. И затем вы продолжаете воссоздавать оператор, который вы добавили в качестве примера.

So:

  • Скопируйте данные
  • Воссоздать бизнес-правила (что будет, если есть заказ без клиента)
  • Создание представлений / постоянных таблиц
  • Используйте данные
person tobi6    schedule 16.02.2018
comment
Спасибо. (Я повторно отредактировал 2-й запрос, который был неверным). Что меня озадачивает в технике dv 2.0, так это то, что хеш-ключи заявлены как способ повышения производительности, но в главе о загрузке BK все равно все равно ищет. Пример в книге просто не очень хорош, потому что он получен из плоской широкой таблицы и поэтому не касается внешних ключей (и связанных с этим соединений?), Которые вы бы имели в типичных данных 3NF. Я думаю, что это действительно недостаток книги. - person radialmind; 18.02.2018
comment
Если вы имеете в виду книгу Linstedt, Olschimke, то я думаю, что бизнес-ключи напечатаны там только для примеров. Глядя на утверждения, каждая сущность загружается сама. Таким образом, ни одно из ваших утверждений не является правильным в смысле DV2.0, но вы должны загружать каждую сущность отдельно. Внешние ключи будут решаться в ссылках. - person tobi6; 19.02.2018
comment
Конечно, но я думаю, что это огромный пробел в дизайне? Легко загружать концентраторы и таблицы, которые имеют очень четкие бизнес-ключи, но ссылки не имеют связанных бизнес-ключей, как концентраторы в методологии хранилища данных? То есть в книге показаны хеш-ключи только для таблиц ссылок, без суррогатных последовательностей или естественных ключей для поиска по этим таблицам. Я написал больше о трех возможностях генерации хэшей здесь: gtoonstra.github.io/etl-with-airflow/. Позвольте мне знать ваши мысли... - person radialmind; 20.02.2018
comment
Я все еще не уверен, что мы здесь на одном уровне. Ссылки действительно связаны с бизнес-ключами - хеш-ключами. Если вам нужны естественные ключи, вы либо присоединяетесь к хабу (что является хорошей идеей, поскольку естественный ключ в хабе должен быть проиндексирован), либо добавляете столбец с естественным ключом. Суррогатные ключи снова могут быть построены, как в вашем бизнесе. Как и в бизнесе, суррогатные ключи создаются после правила. Это правило может быть реализовано поверх данных. И с помощью этого правила вы можете построить суррогатную ссылку. - person tobi6; 21.02.2018

Проблема в том, что вы не экспортируете свой BK. Вы экспортируете суррогатные ключи. Измените o.orderid на o.order_ref и т. Д. В своих запросах, и все должно встать на свои места. К сожалению, люди не понимают причин появления удостоверений личности. Они являются внутренним элементом базы данных, используемым для повышения производительности и управления, и НИЧЕГО не имеют отношения к БИЗНЕСУ.

pcd

person pcd    schedule 26.02.2018
comment
Хорошо сказано. Я до сих пор не уверен, является ли идея OP только половиной того, что рекомендует методология Data Vault. - person tobi6; 28.02.2018
comment
Прискорбно видеть, что разработчики / разработчики баз данных начинают с использования столбца идентификатора идентификатора в каждой таблице, не понимая, почему, а затем, чтобы ограничить его, они не могут удовлетворить уникальное ограничение на естественный ключ таблицы (и другие ключи Canddate ). Почему люди настаивают на выполнении «select * from ‹table›», а затем думают, что могут использовать идентификатор в качестве ключа хаба. Пожалуйста, найдите время, чтобы понять методологию, пройдите курс моделирования DV, это не имеет значения, но получите правильное понимание того, как работает Data Valt. - person pcd; 02.03.2018