2012-04-23 50 views
1

我管理的系統有來自程序,項目,階段,部門等的許多實體。 公司中的許多人希望他們自己的不同實體的自定義視圖。到目前爲止,我自己一直在創建自定義視圖,但它已經到了我的老闆要求我創建查詢製造商的地步,以便每個員工都可以隨時創建,保存和查看自己的查詢。他們應該能夠選擇他們想要查看的主要數據,然後添加條件以及選擇如何顯示數據。關於創建「查詢生成器」的建議

這是我迄今爲止在數據庫表中的術語:

查詢

id 
name 
desc 
isglobal (1 or 0 value, whether the query can be seen by everyone else) 
creator (id of user in system) 
created (datetime) 
entity (this would be the table name or a key which maps to the table name) 
template (a template of tags that will be parsed to generate the HTML for that query page) 

query_conditions

id 
queries_id 
field 
value 

因此,例如,假設一個叫馬克創建一個查詢/視圖,它將顯示所有將他作爲管理的「項目」呃。會有兩個表中的行看起來像這樣:

查詢:

1 
All projects managed by Mark 
Shows all projects in the system currently managed by Mark 
1 
6 
2012-04-23 00:00:00 
project 

而這正是將被存儲在模板中的字段,它的類型是TEXT的

<!-- BEGIN: ROW --> 
<tr> 
<td>{PROJECT_NAME}</td> 
<td>{PROJECT_DESCRIPTION}</td> 
</tr> 
<!-- END: ROW --> 

query_conditions:

1 
1 (this corresponds to the query id above) 
manager 
6 (this corresponds to Mark's user id in the system) 

我擁有的數據庫設計非常簡單,易於在簡單條件下管理。我已經在想象更先進的條件,您可能想看到任何兩位經理或三位或其他人的項目清單。我認爲第二個表格的當前設計仍然適用,我只需要爲前三列添加相同值的額外行,併爲「值」列添加一個不同的值。我可以在開始時進行一次SQL檢查,看看我是在處理1-condional還是n條件,在這種情況下,我將不得不在SQL中使用OR。

有2個問題我不知道如何最好的方法。

  1. 「值」字段應該是什麼類型。我在考慮99%的時間,價值將是一個整數,但顯然也會有一個日期或字符串的機會。你會推薦什麼樣的數據類型?可能不是最好的,但我幾乎在想我可以序列化和反序列化的BLOB。使用BLOB,我可以將數組存儲在該字段中,這將使我不必存儲多行,就像我前面提到的幾行一樣。

  2. 另一件事是範圍。如果他們想要在特定日期之間創建項目會怎樣或者,例如,列的值在5-10之間。我想知道這是否可以用一個名爲「max_value」的額外列來處理。如果這個列不是NULL,那麼我們假設它是一個範圍,「值」將是min_value。

  3. 有關模板字段的任何建議。我將使它成爲一個TEXT字段,該字段僅在爲該自定義查詢返回的每行數據中被解析。

我認爲向您展示我正在使用的XML文件會很有用。我的老闆不希望爲了創建這些自定義查詢而顯示錶的所有字段,所以我們使用以下XML數據來過濾哪些字段是「允許的」。

<?xml version="1.0"?> 
<entities> 
    <entity> 
     <key>program</key> 
     <table>program</table> 
     <label>Programs</label> 
     <allowed>1</allowed> 
     <fields> 
      <field> 
       <key>name</key> 
       <column>prg_name</column> 
       <label>Name</label> 
       <tag>{PROGRAM_NAME}</tag> 
       <method>getName</method> 
       <allowed>0</allowed> 
      </field> 
      <field> 
       <key>description</key> 
       <column>prg_desc</column> 
       <label>Description</label> 
       <tag>{PROGRAM_DESCRIPTION}</tag> 
       <method>getDesc</method> 
       <allowed>0</allowed> 
      </field>    
     </fields> 
    </entity> 
    <entity> 
     <key>project</key> 
     <table>product</table> 
     <label>Projects</label> 
     <allowed>1</allowed> 
     <fields> 
      <field> 
       <key>name</key> 
       <column>prd_name</column> 
       <label>Name</label> 
       <tag>{PROJECT_NAME}</tag> 
       <method>getName</method> 
       <allowed>0</allowed> 
      </field> 
      <field> 
       <key>description</key> 
       <column>prd_desc</column> 
       <label>Description</label> 
       <tag>{PROJECT_DESCRIPTION}</tag> 
       <method>getDesc</method> 
       <allowed>0</allowed> 
      </field> 
      <field> 
       <key>manager</key> 
       <column>prd_manager</column> 
       <label>Manager</label> 
       <tag>{PROJECT_MANAGER}</tag> 
       <method>getManager</method> 
       <allowed>1</allowed> 
      </field> 
      <field> 
       <key>activity</key> 
       <column>prd_activity</column> 
       <label>Activity</label> 
       <tag>{PROJECT_ACTIVITY}</tag> 
       <method>getActivity</method> 
       <allowed>1</allowed> 
      </field>    
     </fields> 
    </entity> 
</entities> 
+1

實際上,這就是爲什麼SQL被髮明的主要原因 - 允許非技術人員使用純英文單詞查詢數據庫。擁有一個只允許使用SELECT語句的Web界面(使用格式化表格作爲輸出),並且有一些易於使用的指南(從簡單到複雜)可能比查詢瀏覽器更容易使用。 – rid 2012-04-23 16:45:40

+0

我也這麼想過。但是,我的老闆想要一個允許員工創建這些查詢的界面,然後將其保存以供將來使用。基本上最終會成爲一個列出所有查詢名稱的頁面,並允許用戶通過1快速查看每個查詢。 查詢生成器的用戶界面在完成各種嚮導時已經完成。一步一步,您定義您的查詢,設置條件,選擇要顯示的內容並保存。基本條件在這一點上工作得很好。只是不確定數據庫設置。特別是如何處理範圍。 – Justin 2012-04-23 16:56:26

回答

1

如果我是建設它,我會讓人產生這樣的查詢:

「選擇」 然後有一個下拉的表。

然後一旦填充表,使用information_schema.columns找到該表中的所有列。

然後有一個列表框,您可以添加列,從而構建您的列列表。

最後添加第二個列表框添加列的位置並允許用戶鍵入關聯的數據(又名添加StartDate和一個可輸入日期的文本框)。

+1

我添加了一些用於生成查詢生成器UI的XML數據。根據我的老闆,並非所有表格的字段都可以被過濾,所以這是我使用這個XML文件的原因之一。 – Justin 2012-04-23 17:08:53