我有一個要求實現聯繫人數據庫。這個聯繫人數據庫的特殊之處在於,用戶應該能夠動態地(在運行時)添加他/她想要追蹤聯繫人的屬性。其中一些屬性是字符串類型,其他數字和日期。一些屬性具有預定義的值,其他屬性是自由的字段等。用戶還希望能夠快速且容易地查詢這樣的結構。數據庫需要容易處理500 000個聯繫人,每個聯繫人大約有10個屬性。堅持動態屬性和查詢
它導致具有動態屬性的Contact類的動態屬性模型。
class Contact{
private Map<DynamicProperty, Collection<DynamicValue> values> propertiesAndValues;
//other userfull methods
}
的問題是我怎麼能儲存這種結構中的「某些數據庫」 - 它沒有被RDBMS,這樣我可以輕鬆地表達查詢,如
獲取所有聯繫人的名字開頭Martin,他們來自5000公司或以下的公司,按時間順序將此聯繫人插入到數據庫中,只有前100個結果(提供分頁),其中每個部分對應一個動態屬性。
我需要:
- 過濾 - 相等,部分相等,(大,小的整數,日期),並可能聚集 - 但沒有必要在這一點上
- 排序
- 分頁
我正在考慮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,並將其存儲到關係型數據庫,並使用XPath的支持 - 很遺憾,似乎是相當緩慢的500000個聯繫人
- 使用其他數據庫 - 芒果DB或兔崽子來存儲這些信息
哪你會怎麼走,爲什麼?