Уровень приложения JOIN с WHERE и ORDER BY на N postgresql шардах - PullRequest
2 голосов
/ 16 июля 2011

У меня есть кластер postgresql с разными таблицами, находящимися в разных шардах (разные физические серверы postgresql).EG:

shard A + user_group (user_group_id, user_group_name)

shard B + user (user_id, user_group_id (NULL), user_name)

shard C + комментарий (comment_id,user_id, comment_content)

Мне нужно выполнить запросы, которые, если бы все 3 таблицы находились в одном и том же шарде, это выглядело бы примерно так:

SELECT comment_id, comment_content ОТ комментария INNER ПРИСОЕДИНЯЙТЕСЬ к пользователю НА комментарий.user_id = user.user_id ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ к user_group ON user.user_group_id = user_group.user_group_id WHERE user_group_id> 10 И user_name LIKE 'foo%' ORDER BY user_group_name ASC, user_name ASC, комментарий_id ASC

* 1012 будет такой запрос будет выполнен, как ASC *1011* 1012если эти 3 таблицы находятся в трех разных физических осколках postgresql?

Я читал о ссылках, что нужно было бы выполнить объединение на уровне приложения, но я не уверен, как это сделать.Некоторые из сложностей включают в себя: 1. Мощность различных таблиц неизвестна (или может меняться со временем), поэтому на уровне приложений (например, php, python и т. Д.) Мы не будем знать, следует ли нам сначалавыполнить запрос user_group, получить все группы пользователей, затем запросить пользователя, получить всех пользователей и т. д. ... или сначала запросить комментарий, получить все комментарии, затем отфильтровать полученные комментарии по пользователям, затем выполнить фильтрацию по группам пользователей и т. д...

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

Ответы [ 2 ]

1 голос
/ 16 июля 2011

Обычно данные делятся на осколки таким образом, что позволяют вообще избежать межсерверных СОЕДИНЕНИЙ.Потому что эта операция сложная и дорогая.Если ваш пример является гипотетическим, я бы порекомендовал разделить все данные по полю user_id или user_group_id.

Например, шард A будет содержать все таблицы с информацией от пользователей, user_id% 3 = 0, шард B - user_id% 3 =1, шард C - который user_id% 3 = 2. Таким образом, большинство необходимых соединений будет внутри одного шарда.Для некоторых сложных межсерверных запросов у вас может быть общее хранилище NO-SQL, такое как memcached или Redis, которое будет иметь копии необходимых данных из всех сегментов (конечно, это не полная копия всех таблиц).Такие хранилища могут быть легко скопированы на столько серверов, сколько вам нужно.Так работают проекты с высокой нагрузкой.

1 голос
/ 16 июля 2011

Вам нужно просмотреть db_link contrib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...