2017-06-05 100 views
0

我正在開發與API一個網站,可以從移動客戶端進行訪問,應用程序類似於http://zomato.com/優化數據庫的搜索算法

,假設我們已經表車(carID,型號,製造商,傳輸的東西, fuleType,otherOptions)

用戶可以查詢任何字段,查詢也可能包括其他表中的字段,例如,如果我爲製造商和模型創建w分開的表。

當然我可以在所有字段上使用like子句進行查詢,這是正確的方式嗎?何時可能有成千上萬的記錄?

使用移動應用程序或網站時,我需要快速數據庫響應實時查詢。

我對.NET最熟悉,但是如果你給我任何其他建議並引導我完成起點(庫,現有的開源項目),我會很高興。

注:用戶將只能有一個搜索欄和可選的過濾器一樣的模式,類別等..

回答

0

這是我會怎麼做。

使用IQueryable建立您的查詢。您可以使用if語句來檢查是否有任何參數具有值,如果是這樣,則將where語句附加到查詢中。一旦您的查詢全部設置,請將其發送至內存,其格式爲.ToList.AsEnumerable

public List<Data> Search (string param1, string param2) 
{ 
    IQueryable<Data> query = db.SomeTable; 

    if (!String.IsNullOrEmpty(param1)) 
     query = query.Where(m => m.Field1 == param1); // might use contain depending on your use case 

    if (!String.IsNullOrEmpty(param2)) 
     query = query.Where(m => m.Field2 == param2); 

    return query.ToList(); 
} 

我也將使用一個SkipTake的分頁。

編輯:我想要說明的是,如果其他人知道一個更快的函數,請告訴我,這與您將獲得的數據庫速度一樣快。通過使用NoSQL數據庫和靜態文檔,您可以實現更快的響應,但對於數千條記錄,數據庫應該可以正常工作。

+0

是的,我知道這個技術用於查詢數據庫,但在我的情況下,你不知道他查詢哪個字段,所以我正在尋找更先進的東西。我想要一種方式來給API客戶端提供實時響應,例如,當他鍵入前三個字符時,就像搜索引擎一樣開始過濾,我不能使用它需要的文檔作爲數據庫。 –

+0

對於自動完成類型的搜索框,您需要列出關鍵字。最好創建一個包含所有提交的關鍵字的表格,並且您可以使用一個通用規則來說明是否已經提交了一個關鍵字X多次將其添加到用於自動完成的關鍵字表格中。您還應該爲關鍵字實施白名單和黑名單。至於查詢你有什麼應該很好,在每個領域多個where語句。你最有可能要專注於查詢之外的數據庫優化,如索引,緩存等... –

+0

我喜歡黑/白框的想法,那麼你的意思是我將向數據庫發出兩個請求(一個初始加載自動完成數據)另一個是獲得真實結果。我看到我想做的事情並不像我想的那麼複雜,但是既然你提到了NoSql,我以前沒有用過這個,我已經閱讀了一些關於該文章的文章,但無法確認它是否能滿足我的需求(有關係船舶之間的數據庫實體),我不想改變這個問題的主題。但不知道我是否要去關係數據庫,還是應該花更多的時間學習新技術(NoSql) –