2

我有一個大量列(~60)的表,它最終會有大量的行(~10 000),而我' m需要能夠一次高效地搜索多個列值。我不確定搜索是否完全匹配(LIKE 'value',而不是LIKE '%value%'),但LIKE 'value%'可能是一個可以接受的折衷方案。如何在大量列上構建快速搜索表

已經提出了一些解決方案。我不是很熟悉數據庫的設計原則,所以它不是很明顯對我來說這是最好的:分別對每列

  1. 指數。用戶將能夠搜索任何列的組合,因此不會有更復雜的索引工作。讀取的數據量比寫入數據庫要多得多,因此寫入速度放緩不應該成爲問題。

  2. 讓另一個表只是用於搜索,看起來像這樣:

    obj_id col_num col_name col_value 
    -------------------------------------  
    1  1  'name' 'joe'  
    1  2  'job'  'engineer'  
    2  1  'name' 'bill' 
    

    等等。我覺得爲col_num和COL_NAME列是多餘的,但 大概一個比別人更優秀。我不知道這是什麼 叫,雖然它聽起來像Entity-Attribute-Value model(也見this question)。從我所知道的情況來看,與EAV模型的主要區別在於此表格不會是 稀疏;所有實體將具有大部分或全部屬性。

  3. 在第一張桌子上做一個inverted index的另一張桌子。我知道如何在理論上做到這一點,但這將是一項巨大的工作。另外,我們可能會失去每個數據來自哪個列的信息,這並不是很好。此外,這感覺像解決方案1將是多餘的,但我實際上不知道如何創建表索引。

這些是我們到目前爲止提出的解決方案。如果它是相關的,我們使用的是Oracle數據庫,它不是真正可選的,但我有權限以任何必要的方式重構數據庫。那麼,這裏最好的解決方案是什麼?當然,「以上都不是」完全可以接受的答案。這些表格實際上還沒有存在,所以沒有什麼可以消除並重新制作。

謝謝!

+0

優秀解答一切!我希望我可以同時接受他們。謝謝! – andronikus

回答

3

您提到的例子確實是全文搜索的更好匹配(正如Bill Karwin所建議的)。如果沒有看到(草案)表格定義,很難判斷事實是否如此。

好消息是10K記錄對於調整良好的Oracle服務器來說是微不足道的。如果這是你的桌子最大的增長,我會避免任何有利於可維護性的奇特解決方案。

EAV基本上使布爾運算符變成背後的巨大痛苦,並使支持特定數據類型(文本,日期,數字等)變成同樣大的痛苦。

我會在索引模式建立自己的表的樣本與你最好的猜測,有代表性的虛擬數據填充它,並運行沿着你期望需要的人的行查詢。衡量績效,看看你是否有問題;優化您的索引和查詢,並只去重構,如果你真的需要。

+0

事實上,我們正在尋找在使用布爾查詢,我不激動不必實現他們! – andronikus

3

如何使用Oracle的全文搜索功能?您的需求似乎符合CTXCAT的目的。

有關Oracle中不同全文索引選項的概述,請參閱Indexing with Oracle Text