2016-05-26 4 views
0

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

Events 
event_id|time|key1|key2|data 

И это необходимо для выполнения запросов, как это эффективно:

Получить все события, key1/key2 = ... и время между ... и ...

Одна схема, я думал о том, будет иметь

Events 
primary_key=event_id|key1|key2|data 

Key1Lookup 
primary_key=key1|sortkey=time|event_id 

Key2Lookup 
primary_key=key2|sortkey=time|event_id 

Так что мой запрос может выглядеть

SELECT data FROM Events, Key1Lookup WHERE key1=... AND time BETWEEN ... AND ... AND Events.event_id = Key1Lookup.event_id

или

SELECT data FROM Events, Key2Lookup WHERE key2=... AND time BETWEEN ... AND ... AND Events.event_id = Key2Lookup.event_id

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

Дополнительная информация: Event_id уникален. В Key1Lookup ключ1 не уникален, но в Key1Lookup есть несколько повторений (подумайте об этом как user_id в таблице комментариев). В Key2Lookup key2 не уникален, но в Key2Lookup есть несколько повторений (подумайте об этом как location_id в таблице комментариев). Существует огромное количество различных ключей1, и существует огромное количество различных ключей2. Я ожидаю, что отличное количество key1s будет много увеличиваться, и я ожидаю, что значительное количество key2s увеличится.

ответ

0

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

  • Redshift действительно не понимает, первичные ключи или делает любое индексирование внутри. Это то, что говорит documentation.

ЕДИНСТВЕННОСТЬ, первичный ключ, и ограничение внешнего ключа носит исключительно информационный характер ; они не применяются Amazon Redshift.

  • Redshift хранит данные в столбчатом формате. Итак, если ваш запрос выбора не относится к определенному столбцу, все данные в этом столбце будут проигнорированы.
  • Ключи распределения могут использоваться для совместного размещения соединений на двух таблицах. Однако в этих двух таблицах может быть только один ключ dist.

Основываясь на этих двух, я бы рекомендовал следующее:

  • Определенно есть ключ сортировки на timestamp. Поэтому любой запрос between ... and ... на timestamp просто пропустит ненужные строки.
  • Если бы у вас был всего один key, вы могли бы воспользоваться предложенной схемой.key был бы ключом dist, из-за которого ваши соединения (с таблицей Events) были бы очень эффективными. Но не может пройти этот маршрут, потому что у вас есть два ключа.
  • Таким образом, наличие де-нормированных данных (event_id=primary-key|timestamp=sort-key|key1|key2|data) было бы очень эффективным.
    • Это будет лучше, чем объединение трех таблиц (каждое из которых будет расти со временем) каждый раз.
    • И как я сказал ранее, если ваш запрос выбора имеет условие только для одной клавиши (например, key1=...), весь столбец key2 будет проигнорирован.
+0

Итак, единственная разница, которую вы предлагаете, - сделать event_id отличной, правильно? – michaelsnowden

+0

см. Пункт № 2 выше: я сказал, что нет смысла использовать ключ dist в вашей настройке. Пример №3: вы можете поместить event_id в качестве первичного ключа, если хотите. –

+0

Моя основная рекомендация - иметь денормализованные данные, в отличие от нормализованного, который вы имеете в виду. и я думаю, я поставил достаточно аргументов за это –