При наборе таблицы FACT в хранилище данных лучше всего использовать первичный ключ из внешней таблицы или уникальный ключ или идентификатор, используемые бизнесом?Правильный путь к таблице фактических данных хранилища данных
Например, (см. Иллюстрацию ниже), предположим, что у вас есть две таблицы размеров «DimStores» и «DimCustomers» и одна таблица FACT с именем «FactSales». Обе таблицы измерений имеют индексное поле первичного ключа, которое является целым типом данных и имеет имя «ID». Они также имеют индексированное уникальное поле бизнес-ключа, которое представляет собой буквенно-цифровой текстовый тип данных с именем «Число».
Как правило, вы должны использовать первичный ключ таблиц измерений в качестве внешних ключей в таблице FACT. Тем не менее, мне интересно, если это лучший подход.
Используя первичный ключ, чтобы просмотреть или выполнить вычисления по фактам в таблице FACT, вам, вероятно, всегда придется делать запрос соединения на первичный ключ и использовать бизнес-ключ в качестве поиска , Причина в том, что большинство пользователей не знают значения первичного ключа для поиска в таблице FACT. Однако они, вероятно, будут знать бизнес-ключ. Поэтому для использования этого бизнес-ключа вам нужно будет выполнить запрос соединения, чтобы сделать отношения.
Поскольку бизнес-ключ индексирован в любом случае, было бы лучше просто использовать это как внешний ключ в таблице FACT? Таким образом, вам не нужно было бы присоединяться и просто выполнять поиск или вычисления напрямую?
Я думаю, это сводится к тому, что запросы на вступление стоят так дорого? Представьте, что вы имеете дело с миллиардной таблицей FACT и ее размерами с десятками миллионов записей.
Пример таблицы:
DimStores:
+------------+-------------+-------------+
| StoreId | StoreNumber | StoreName |
+------------+-------------+-------------+
| 1 | S001 | Los Angeles |
| 2 | S002 | New York |
+------------+-------------+-------------+
DimCustomers:
+------------+----------------+--------------+
| CustomerId | CustomerNumber | CustomerName |
+------------+----------------+--------------+
| 1 | S001 | Michael |
| 2 | S002 | Kareem |
| 3 | S003 | Larry |
| 4 | S004 | Erving |
+------------+----------------+--------------+
FactSales:
+---------+------------+------------+
| StoreId | CustomerId | SaleAmount |
+---------+------------+------------+
| 1 | 1 | $400 |
| 1 | 2 | $300 |
| 2 | 3 | $200 |
| 2 | 4 | $100 |
+---------+------------+------------+
В выше, чтобы получить общий объем продаж в магазине Лос-Анджелесе, я должен был бы сделать это:
Select Sum(SaleAmount)
From FactSales FT
Inner Join DimStores D1 ON FT.StoreId = D1.StoreId
Where D1.StoreNumber = 'S001'
Если бы я использовал «StoreNumber» и «CustomerNumber» в качестве внешних ключей вместо таблицы «FactSales». Я не пришлось бы сделать запрос присоединиться и мог непосредственно сделать это вместо:
Select Sum(SaleAmount)
From FactSales
Where StoreNumber = 'S001'
Спасибо за ответ. Да, я понимаю, почему мы используем целые первичные ключи.Но мне просто интересно, есть ли разница в производительности, делая это. Или если мы отказываемся от производительности по причинам отсутствия управления (отсутствие лучшего слова). Это я понимаю. Опять же, я пытаюсь сузить хит производительности, поэтому я могу оценить общие плюсы и минусы. – ptownbro
Если вы используете Oracle, то разница между различными типами данных, которые вы можете использовать для первичного ключа, очень мала. Единственное исключение, которое я бы хотел, - это предложить время данных данных DATA для вашего измерения времени (если оно у вас есть). Гораздо важнее получить правильный план выполнения. – BobC
Спасибо. я ценю вашу помощь – ptownbro