Можно ли выполнить OQL-запрос GemFire для всех дочерних областей родительского региона в одном запросе
Мне нужно составить иерархию регионов, например, следующую, как обычно я делаю запросы по странам и типам. Я помещаю все данные в регионы странового уровня. Иногда я делаю запросы по странам с NAM_Type1, а иногда и по всему миру.
Global_Type1
-> NAM_Type1
--> USA
--> Mexico
-> APAC_Type1
--> Japan
--> HongKong
Есть ли способ, которым я могу запросить родительский регион, не запрашивая несколько раз по отдельным странам?
Можно ли создавать индексы на родительском уровне?
Я использую GemFire 7.0 с Spring-Gemfire для подключения.
1 ответ
@Ashish
Если я правильно понимаю вашу проблему, быстрый ответ - нет.
Кажется, вы хотите использовать родительский регион (например, NAM_Type1) для ссылки или, скорее, для запроса данных, содержащихся в нескольких субрегионах родительского региона (например, США, MEXICO и т. Д.), И "агрегировать" результаты всех субрегионов. Регионы???
Например, если предположить, что ваши субрегионы содержат объекты Customer...
public class Customer ... {
private String firstName;
private String lastName;
private boolean active;
...
}
Затем...
SELECT * FROM /NAM_Type1 nam WHERE nam.active = 'true';
Этот запрос OQL не работает, так как он не является ссылкой между родительским регионом (например, NAM_Type1) и записями в субрегионах (например, США и т. Д.). Если вы используете "родительские" области только для иерархии пространства имен, то они вообще не содержат данных.
Мне интересно, зачем нужны "субрегионы"? Субрегион не рассматривается иначе, чем Регион верхнего уровня, когда дело доходит до доступа к данным (особенно с OQL/ запросами).
Использование подрегионов означает, что вы используете и ограничены использованием REPLICATE Regions, как указано в Руководстве пользователя GemFire здесь ( http://gemfire.docs.pivotal.io/latest/userguide/index.html). По этой причине, среди прочего, команда GemFire обычно не рекомендует использовать субрегионы, особенно там, где транзакционные данные могут сильно измениться.
В общем, вы хотите использовать области PARTITION для транзакционных данных, а области REPLICATE - в основном для небольших наборов данных и, как правило, для справочных / справочных данных.
Так что, в вашем случае, вы можете добиться аналогичного поведения с помощью...
- Использование регионов PARTITION...
- Настроены и созданы на разных серверах...
- Организованные в разные группы серверов на основе иерархической организации, которую вы указали выше.
Затем вы можете настроить таргетинг и запустить функцию GemFire на серверах в определенных группах серверов, содержащих данные для интересующей вас демографической области, чтобы выполнить запрос OQL для локального набора данных региона. Функция агрегирует и затем возвращает результаты.
Существуют различные способы организации и разделения данных, даже используя пользовательские " PartitionResolvers" и т. Д., Или для назначения функций и т. Д.
Используя PARTITION Regions, вы все равно можете достичь HA (избыточность), используя атрибут "копий" (который соответствует свойству GemFire PartitionAttributes.redundantCopies). У вас есть возможность "совмещать" данные, чтобы сделать / уравновешенные запросы возможными / оптимальными.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: не будучи глубоко знакомы с вашими прецедентами и требованиями, мои предложения могут или не могут работать для вашей ситуации, но обычно эффекты субрегионов могут быть достигнуты более элегантно и эффективно с использованием других функций GemFire. Если что, возможно, это даст вам некоторые идеи.
Надеюсь это поможет!
-John