2015-09-10 2 views
2

У меня есть таблица, которая хранит информацию о взаимоотношениях между парами пользователей:Есть ли эффективный способ объединения двух таблиц?

{user1, user2} 

и таблицы о том, как пользователи обзора услуги:

{user, review} 

я хотел бы таблицу, которая сочетает в себе следующее:

{user1, user1_review, user2, user2_review} 

Я делал это на тестовых данных на 1) создание продукта обзора с псевдонимом сам по себе, чтобы дать:

user1, review1, user2, review2 
1, good, 2, poor 
1, good, 3, great 
2, poor, 1, good 
2, poor, 3, great 
3, great, 1, good 
3, great, 2, poor 

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

Это работает отлично, но я не могу его масштабировать. Фактическая таблица обзора составляет 700 МБ в виде текстового файла, и я запускаю память приложения при запуске запроса для создания продукта, большая часть которого будет удалена на этапе 2 в любом случае.

Есть ли другой способ, который я могу организовать для достижения того, чего хочу?

+0

Вы говорите, что 700 МБ в виде текстового файла, но теперь хранятся данные в реальной таблице dbms? Определения таблиц, любые индексы и т. Д.? – jarlh

+0

какую базу данных вы используете? есть ли какие-либо индексы? – learningNew

+0

Использование пакета sqldf в R. Нет индексов только обычного текста, сохраненного в формате CSV. – ThomasC

ответ

0

Не создавайте перекрестный продукт огромного стола - он работает ужасно медленно, если оптимизатор не работает, как избежать того, что вы ему скажете.

Вы должны присоединиться к таблице отношений с двумя псевдонимами таблицы отзывов:

SELECT user1, r1.review AS user1_review, user2, r2.review AS user2_review 
    FROM relationship AS r0 
    JOIN review AS r1 ON r0.user1 = r1.user 
    JOIN review AS r2 ON r0.user2 = r2.user 

ли убедитесь, что вы получили соответствующие индексы на месте. Это будет в столбце «Пользователь» таблицы «Обзор» и, возможно, индексируется с каждым столбцом «Пользователь» в таблице «Связь» в качестве ведущего столбца (у вас, вероятно, есть уникальный индекс в паре столбцов - скажем (user1, user2) в этом порядке , тогда вам нужен индекс и на user2).

И вы говорите "Plain text stored in 700 MiB CSV format" - забудьте о производительности; не существует способа обработки, который не хранится в обычной индексированной таблице. Таблицы создаются для обеспечения производительности. CSV-файлы не обеспечивают производительность в качестве опции.

+0

Если это все пользовательские отношения и запросы, которые запрашиваются, то индексы могут не быть полезными, конечно, в зависимости от СУБД. –

+0

Да; индексирование является специфичным для СУБД. Я считаю, что это подпадает под «соответствующие индексы». Если конкретный индекс не будет использоваться СУБД, это не подходит. –

Смежные вопросы