Загрузить данные в денормализованную таблицу Cassandra

Я понимаю, что, поскольку Cassandra не поддерживает соединение, иногда нам нужно создавать денормализованную таблицу. Учитывая, что мне нужно получить имена элементов для каждого элемента в заказе с заданным идентификатором заказа, я создаю таблицу, используя:

CREATE TABLE order (
  order_id int,
  item_id int,
  item_name,
  primary key ((id), item_id)
);

У меня есть два CSV-файла для загрузки данных, order.csv и item.csv, где order.csv содержит order_id и item_id, а item.csv содержит item_id и item_name.

Вопрос, как загрузить данные из csv файла в таблицу, которую я создаю? Сначала я вставляю данные из файла заказа, и все работает нормально. Когда я вставляю элемент, он выдает ошибку с сообщением об отсутствии первичного ключа.

Любая идея, как я могу вставить данные из разных входных файлов в денормализованную таблицу? Спасибо.


person Fang Shuwei    schedule 01.10.2016    source источник
comment
Спасибо за ответ. Наконец-то я написал код для объединения двух CSV-файлов перед импортом в базу данных.   -  person Fang Shuwei    schedule 08.10.2016


Ответы (2)


есть опечатка в определении первичного ключа, он должен быть

CREATE TABLE order (
  order_id int,
  item_id int,
  item_name,
  primary key (order_id, item_id)
);

Вы используете COPY для загрузки данных?

Что касается денормализации, это зависит от вашего варианта использования, обычно в нормализованной схеме у вас будет одна таблица для заказов, другая для клиентов, и вы выполните соединение с SQL для одновременного отображения информации о заказе и клиентах; в этом случае для денормализованной таблицы у вас будет информация о заказе и клиенте в одной таблице, поля будут зависеть от того, как вы собираетесь использовать запрос.

Как правило, перед созданием таблицы вам сначала нужно определить, что вы собираетесь использовать.

person Carlos Monroy Nieblas    schedule 03.10.2016

Использование вторичного индекса на вашем item_id должно помочь:

CREATE INDEX idx_item_id ON order (item_id);

Теперь вы должны иметь возможность запрашивать, например:

SELECT * FROM order WHERE item_id = ?;

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

Дополнительную информацию см. в документации Cassandra Index.

person xmas79    schedule 03.10.2016