2010-03-04 68 views
0

我有一個要求實現聯繫人數據庫。這個聯繫人數據庫的特殊之處在於,用戶應該能夠動態地(在運行時)添加他/她想要追蹤聯繫人的屬性。其中一些屬性是字符串類型,其他數字和日期。一些屬性具有預定義的值,其他屬性是自由的字段等。用戶還希望能夠快速且容易地查詢這樣的結構。數據庫需要容易處理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或兔崽子來存儲這些信息

哪你會怎麼走,爲什麼?

回答

0

您是否考慮過使用Lucene來滿足您的查詢需求?您可能只需使用Lucene就可以逃脫並將所有數據存儲在索引中。雖然我不會推薦使用Lucene作爲唯一的持久性存儲。

或者,您可以將Lucene與RDBMS一起使用,並利用Compass之類的優勢。

1

Wikipedia在Entity-Attribute-Value modeling上有一個很棒的條目,它是一個用於表示具有任意屬性的實體的數據建模技術。它通常用於臨牀數據,但也可能適用於您的情況。

0
  1. 你可以嘗試其他類型的像CouchDB的數據庫,這是一個面向文檔的數據庫和分佈
  2. 如果你想有一個愚蠢的解決方案,爲您的聯繫人表,你可以添加喜歡STRING_COLUMN1,STRING_COLUMN2一些列50 ..高達10,DATE_COLUMN1..DATE_COLUMN10。你有另一個描述列。因此,如果某行的名稱是一個字符串,那麼STRING_COLUMN1將存儲您的名稱的值,並且DESCRIPTION列值將爲「STRING_COLUMN1-NAME」。在這種情況下,查詢可能有點棘手。我知道很多純粹主義者嘲笑這個,但我已經看到類似的需求在這些應用程序之一解決這個問題:)