У меня есть требование для реализации базы контактов. Эта база данных контактов является особой, так как пользователь должен иметь возможность динамически (во время выполнения) добавлять свойства, которые он / она хочет отслеживать в контакте. Некоторые из этих свойств имеют тип string, другие числа и даты. Некоторые свойства имеют предопределенные значения, другие являются свободными полями и т. Д. Пользователь хочет иметь возможность быстро и легко запрашивать такую структуру. База данных должна легко обрабатывать 500 000 контактов, каждый из которых имеет около 10 свойств.
Это приводит к тому, что динамическая модель свойств имеет класс Contact с динамическими свойствами.
class Contact{
private Map<DynamicProperty, Collection<DynamicValue> values> propertiesAndValues;
//other userfull methods
}
Вопрос в том, как я могу сохранить такую структуру в «некоторой базе данных» - это не обязательно должна быть СУБД, чтобы я мог легко выражать запросы, такие как
Получить все контакты, чье имя начинается с Мартина, они принадлежат компании с размером 5000 или меньше, упорядочить по времени, когда этот контакт был вставлен в базу данных, только первые 100 результатов (предоставьте нумерацию страниц), где каждый из этих сегментов соответствует динамическое свойство.
Мне нужно:
- фильтрация - равенство, частичное равенство (больше, меньше для целых чисел, дат) и, возможно, агрегация - но в этом нет необходимости
- сортировка
- 1017 * пагинация *
Я рассматривал RDBMS, но это приводит к меньшей структуре этой структуры, к которой довольно сложно обращаться, и она имеет тенденцию быть медленной для такого количества данных
contact(id serial pk,....);
dynamic_property(dp_id serial pk, ...);
--only one of the values is not empty
dynamic_property_value(dpv_id serial pk, dynamic_property_fk int, value_integer int, date_value timestamp, text_value text);
contact_properties(pav_id serial pk, contact_id_fk int, dynamic_propert_fk int);
property_and_its_value(pav_id_fk int, dpv_id int);
Рассматриваю следующие варианты:
- хранить контакты в RDBMS и использовать Lucene для запросов - есть ли что-нибудь, что может помочь с этим?
- Сохранение динамических свойств в виде XML и сохранение их в rdbms и использование поддержки xpath - к сожалению, для 500000 контактов это выглядит довольно медленно
- использовать другую базу данных - Mango DB или Jackrabbit для хранения этой информации
В какую сторону вы пойдете и почему?