我需要实现联系人数据库。此联系人数据库的特殊之处在于用户应该能够动态地(在运行时)添加他/她想要跟踪联系人的属性。其中一些属性是字符串,其他数字和日期。一些属性具有预定义的值,其他属性是自由字段等。用户希望能够快速且容易地查询这样的结构。数据库需要容易处理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);
我考虑以下选项:
你会选择哪种方式?为什么?
答案 0 :(得分:1)
Wikipedia在Entity-Attribute-Value modeling上有一个很棒的条目,这是一种用于表示具有任意属性的实体的数据建模技术。它通常用于临床数据,但也可能适用于您的情况。
答案 1 :(得分:0)
您是否考虑过使用Lucene来查询查询?你可能只是使用Lucene并将所有数据存储在索引中。虽然我不建议使用Lucene作为你唯一的持久存储。
或者,您可以将Lucene与RDBMS一起使用,并利用Compass之类的内容。
答案 2 :(得分:0)