持久化动态属性和查询

时间:2010-03-04 14:36:15

标签: java oop

我需要实现联系人数据库。此联系人数据库的特殊之处在于用户应该能够动态地(在运行时)添加他/她想要跟踪联系人的属性。其中一些属性是字符串,其他数字和日期。一些属性具有预定义的值,其他属性是自由字段等。用户希望能够快速且容易地查询这样的结构。数据库需要容易处理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并将其存储到rdbms并使用xpath支持 - 不幸的是,对于500000个联系人而言似乎相当缓慢
  • 使用另一个数据库 - Mango DB或Jackrabbit来存储此信息

你会选择哪种方式?为什么?

3 个答案:

答案 0 :(得分:1)

Wikipedia在Entity-Attribute-Value modeling上有一个很棒的条目,这是一种用于表示具有任意属性的实体的数据建模技术。它通常用于临床数据,但也可能适用于您的情况。

答案 1 :(得分:0)

您是否考虑过使用Lucene来查询查询?你可能只是使用Lucene并将所有数据存储在索引中。虽然我不建议使用Lucene作为你唯一的持久存储。

或者,您可以将Lucene与RDBMS一起使用,并利用Compass之类的内容。

答案 2 :(得分:0)

  1. 您可以尝试其他类型的数据库,例如CouchDB,这是一个面向文档的数据库并且是分布式的
  2. 如果你想要一个愚蠢的解决方案,对于你的联系人表你可以添加大约50列,如STRING_COLUMN1,STRING_COLUMN2 ......高达10,DATE_COLUMN1..DATE_COLUMN10。您有另一个DESCRIPTION列。因此,如果行的名称是字符串,则STRING_COLUMN1存储您的名称的值,而DESCRIPTION列的值将为“STRING_COLUMN1-NAME”。在这种情况下,查询可能有点棘手。我知道很多纯粹主义者对此嗤之以鼻,但我在其中一个应用中看到了类似的要求:)