目前,db4o不允許對收藏內容進行索引。什麼對象數據庫允許索引數據庫中的任何單個字段?什麼對象數據庫允許索引數據庫中的所有內容?
實施例:
class RootClass
{
string thisIsIndexed; // Field can be indexed for quick searching.
IList<SubClass> contentsNotIndexed = new ArrayList(); // Creates a 1-to-many relationship.
}
class SubClass
{
string thisIsNotIndexed; // Field cannot be indexed.
}
對於db4o的由字段「thisIsNotIndexed」進行搜索,那就要加載完整的對象到內存中,然後使用LINQ到對象通過場進行掃描。這很慢,因爲這意味着您可能必須將整個數據庫加載到RAM中才能執行搜索。解決此問題的方法是在根對象中包含要搜索的所有字段,但這看起來像是一種人爲限制。
是否有任何不受此限制的對象數據庫,並允許索引子對象中的任何字符串?
更新
答案#1:
我發現這給兩全其美的方法:使用全索引的易用性(具有層次結構),以及令人眼花繚亂的快速機查詢整棵樹。它涉及到一個位一招,那緩存父節點的內容的方法:
- 創建嵌套層級爲正常。
- 對於每個子節點,創建對父節點的反向引用。
- 您現在可以查詢葉節點。現在我們已經到了一半 - 但是,我們可以查詢它的速度慢,因爲如果要通過父節點中的某個參數進行搜索,它必須執行連接才能導航樹節點。
- 爲了加快速度,創建一個「緩存」參數,在父節點中緩存搜索條件。它的一個方法最初設置爲null,它第一次調用它進行昂貴的連接,然後它反映了該領域,從那時起搜索就非常快速。
- 這適用於永不改變的數據,即溫度樣本隨着時間的推移。如果數據將要改變,那麼如果根節點中的值發生變化,您可能需要通過在每個葉節點中設置一個「髒」標誌來清除緩存的值。
答案#2:
如果你使用一個數組,而不是一個列表,你可以下降到使用SODA的子節點。如果您使用List,SODA不支持它,所以您不能使用SODA(或任何其他依賴SODA的查詢,如LINQ,QBE,Native查詢等)進行查詢。
您引用了「根據您的需要,您還可以設計您的課程以在某些情況下使用數組而不是ArrayList來實現您想要的效果。」 - 我很好奇你會如何做這個設計?也許添加一個從「子查詢」到「rootclass」的反向鏈接,這將允許您半效創建一個查詢,通過「子類」和「主類」的內容進行過濾? – Contango 2011-02-27 23:18:39
在DBO4O中,至少在Java/Scala下,可以將(SODA方式)下降到數組值域並按照您對其他域的查詢方式進行查詢。 – 2011-02-28 03:18:57
非常好,感謝您的反饋。 – Contango 2011-02-28 12:44:31