0

目前,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:

我發現這給兩全其美的方法:使用全索引的易用性(具有層次結構),以及令人眼花繚亂的快速機查詢整棵樹。它涉及到一個位一招,那緩存父節點的內容的方法:

  1. 創建嵌套層級爲正常。
  2. 對於每個子節點,創建對父節點的反向引用。
  3. 您現在可以查詢葉節點。現在我們已經到了一半 - 但是,我們可以查詢它的速度慢,因爲如果要通過父節點中的某個參數進行搜索,它必須執行連接才能導航樹節點。
  4. 爲了加快速度,創建一個「緩存」參數,在父節點中緩存搜索條件。它的一個方法最初設置爲null,它第一次調用它進行昂貴的連接,然後它反映了該領域,從那時起搜索就非常快速。
  5. 這適用於永不改變的數據,即溫度樣本隨着時間的推移。如果數據將要改變,那麼如果根節點中的值發生變化,您可能需要通過在每個葉節點中設置一個「髒」標誌來清除緩存的值。

答案#2:

如果你使用一個數組,而不是一個列表,你可以下降到使用SODA的子節點。如果您使用List,SODA不支持它,所以您不能使用SODA(或任何其他依賴SODA的查詢,如LINQ,QBE,Native查詢等)進行查詢。

回答

1

我這個基礎上根據斯卡拉&的Java我的DB40經驗,但希望這是仍然有效:字段「contentsNotIndexed」持有ArrayList的實例,因此該索引字段應該只assit您在查詢這些ArrayList的實例。如果您想要有效地查詢這些列表的內容,則必須爲您希望在列表中找到的對象定義一個索引,然後在「contentsNotIndexed」字段下面查詢ArrayList。我不知道ArrayList的內部來建議可能下降的地方。

根據您的需要,您還可以設計您的類以在某些情況下使用數組而不是ArrayList來實現所需的效果。

+0

您引用了「根據您的需要,您還可以設計您的課程以在某些情況下使用數組而不是ArrayList來實現您想要的效果。」 - 我很好奇你會如何做這個設計?也許添加一個從「子查詢」到「rootclass」的反向鏈接,這將允許您半效創建一個查詢,通過「子類」和「主類」的內容進行過濾? – Contango 2011-02-27 23:18:39

+0

在DBO4O中,至少在Java/Scala下,可以將(SODA方式)下降到數組值域並按照您對其他域的查詢方式進行查詢。 – 2011-02-28 03:18:57

+0

非常好,感謝您的反饋。 – Contango 2011-02-28 12:44:31

2

那麼,你可以在你的例子中索引SubClass.thisIsNotIndexed。因此您可以快速找到子類實例。

但是,當然你是對的,你不能索引集合。由此我的意思是,如果一個集合包含某些元素等,則不可能有效的查詢。例如,如果您想查詢包含某個子類的所有RootClass。由於缺乏適當的收集索引,這種情況會比較緩慢。

在db4o中,您必須解決此問題。一個例子是在SubClass上添加一個包含對父級引用的字段。然後你可以有效地進行查詢。

另一個小東西。您可以在收集字段上設置索引。但那只是對收集對象的引用的索引。這將允許你找到對某個collection-instance有引用的對象。這通常很沒用。

我猜更大的對象數據庫確實支持與它一起收集和查詢索引。

+0

謝謝,我非常感謝澄清。我很喜歡db4o,它是一個非常棒的數據庫 - 但爲了記錄,您是否知道任何品牌名稱對象數據庫都允許引用「支持收集和查詢的索引」? – Contango 2011-02-27 23:16:03

+0

感謝您的評論「在db4o中,你必須解決這個問題,一個例子就是在SubClass中添加一個包含父對象引用的字段,然後你就可以有效地進行查詢。」實際上,每個查詢都會在「子類」和「rootclass」之間進行按ID查找,或者它是否是一個真正有效的查詢,它將根據「rootclass」中的索引字段和「子類中的索引字段「? – Contango 2011-02-27 23:20:57

+0

不,我不能支持這種索引的對象數據庫,因爲我沒有使用它們/試用過它。在添加對根類的引用時查詢的效率如下:是的,這基本上是一個連接,當您還爲根類添加條件時。如果標準隻影響子類,那麼它是一個簡單的查詢。但是你通過引用導航到根類。 – Gamlor 2011-02-27 23:30:12

相關問題