如何為查詢建構器項目設計數據庫?
我有這個項目,使用者可以在其中使用基於 Web 的 UI 創建查詢,其中將列出列和適用的運算符。以後的使用者也可以編輯這些查詢。所以我需要將它儲存在數據庫中。
我可以將查詢作為簡單字元串儲存在表中,但隨後將無法進行編輯,因此我需要以其他方式儲存它。所以我設法按照以下方式設計它。
所以假設我必須儲存這個查詢:
C1 > 8 AND (C2 <= 7 OR (C4 LIKE '%all%' AND (C1 > 15 OR C2 <= 3)))
其中:C 表示某個列
如果我必須將它儲存在數據庫中,如圖所示,
- 我會將每個條件分組並將其儲存在 sub_operand 表中
- 那麼對於 sub_operand 表中的每個條目,op_master 表中都會有遞歸映射條目
- 最後在 op_master 中會有 master 入口
但是處理插入和更新似乎太複雜了。有人可以幫我弄這個嗎?我非常困在這裡。
更新:我想我在模式中遺漏了一些東西。它不會像我想的那樣工作。我會盡快更正問題。
您可以採用的一種方法是設計一個實現堆棧的表,可以將邏輯表達式的組件以反向拋光(後綴)表示法放置在該堆棧中。在這樣的設計中,謂詞的每個組件都插入到帶有順序號的表中,以指定反向評估順序。為了評估它們,編寫查詢以按訂單號讀取它們,在遇到時應用運算符,並儲存中間結果以供下一個應用。使用反向拋光錶示法消除了對括號的需要,並且可以支持將表達式嵌套到任何級別。
這是一篇特定於 SQL Server 的文章,它展示了這種解決方案。現在在本文中,作者正在開發一個更複雜的實施業務規則的範例,以確定員工是否有權執行特定操作。它可以很容易地適應您的案例,因為在這兩種情況下,所實現的都是邏輯表達式儲存和評估引擎。
我希望這可以為您指明一個方向,使您能夠更輕鬆地處理解析嵌套邏輯表達式帶來的複雜性!
PostgreSQL
PostgreSQL 使查詢可以從伺服器外部訪問。這是通過Lukas Fittl 的
libpg_query
. 您可以在多種語言中找到與它的綁定,包括 Ruby Go、Node 和 Python。這只是說您可以創建@Todd 指定的中間語言,這將需要指定一個
to_intermediate
andfrom_intermediate
函式,或者您可以查看 RDBM 是否支持掛鉤到解析器。