Database-Design

如何為查詢建構器項目設計數據庫?

  • January 19, 2022

我有這個項目,使用者可以在其中使用基於 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_intermediateandfrom_intermediate函式,或者您可以查看 RDBM 是否支持掛鉤到解析器。

引用自:https://dba.stackexchange.com/questions/136261