2015-09-03 73 views
1

我在設計我的應用程序數據庫時碰到了一個問題。我在網上搜索了類似的結構,但無法找到任何結構。因此,這裏的問題:需要針對場景的數據庫設計

我設計了搜索頁面一個頁面,數據grid.see下面的屏幕截圖:

The scenario when the first identity is chosen

我有一個表稱爲接觸有一與身份和它的子類型的關係。

身份類型現在只有兩個值,但未來可能會增加(停車位,居住面積),基於在下拉列表中選擇的項目,搜索字段會發生更改,網格視圖也會隨之更改(請參閱標題)。第一個圖像顯示,當選擇身份類型停車時,用戶可以按部分,車道,行和停車編號過濾結果。

The scenario when the first identity is chosen

如果我們改變了身份輸入搜索字段與場是相同的兩個身份類型又變了。

用戶應該可以選擇保存在數據庫中從電網聯繫人(在接觸表)中選擇的細節的能力。

我很困惑,我應該如何設計一個數據庫,將顯示與標識字段和這些身份不是可以用相對於接觸被保存到數據庫中的網格。

這裏是我想出了

Database Schema

我仍然沒有就如何將選定的行會被保存在數據庫中清晰的東西。

任何幫助,將不勝感激。

回答

2

我認爲你需要改變你的方法。首先,您應該設計包含業務數據的數據庫,而不必擔心如何保存搜索對話框的狀態。在這一點上包括這些只會混淆設計。

你給出的圖表看起來不錯。你應該刪除'IdentityType'表。這不是一張好桌子 - 它包含兩種完全不同類型的東西。這總是在SQL數據庫中出現錯誤的線索。而在OO中,我們可能有兩個類ContactIdentityBuildingIdentity,它們從公共基類或接口繼承,但這不是在SQL中執行的正確方法。現在

,你應該能夠使每個搜索頁面在Javascript中的工作。試着這樣做,忘記了你想要一個適用於不同組列的'一般情況'解決方案。你似乎剩下的兩個問題:

  • 如果添加了一個新的身份,你希望能夠「在配置上」這樣做,通過改變一些數據,而不是編寫新的代碼。
  • 您希望能夠保存用戶的搜索,可能(但不一定)保存在同一個數據庫中。

第一個是你如何設計你的應用程序的問題。您不應該期望接口將完全反映數據庫結構。你可以有更多的數據庫表,並且仍然有兩個相同的搜索方法。或者你可以有更多的搜索方法,仍然使用你現有的相同表格。無論哪種方式,您都應該警惕試圖從數據庫表格的結構中自動生成搜索頁面。而是選擇您可能使用的「視圖」,並找到表示其元數據的好方法。這可以是例如可以過濾/排序的列的列表。或者是SQL查詢的文本,它可以檢索您想要在表格中擁有的所有項目。

其次,你想保存搜索。有兩種方法可以做到這一點 - 是否要保存搜索參數(以便可以在不同時間再次運行相同的過濾/排序,對可能更改的數據進行更新並顯示最新結果?或者你想保存結果,以便用戶可以看到他們發現的那一組條目嗎?

我傾向於認爲第一個更有意義,因爲這意味着他們沒有看到可能是如果是這樣的話,我會嘗試和存儲所有過濾器的細節,比如像JSON對象(你也可以使用XML--我傾向於認爲JSON更容易處理)在JSON中可能看起來像這樣:

{ 
    "query": "parking", 
    "filters": { 
    "section": "A", 
    "lane": [1, 2, 5, 6], 
    "row_number": { 
     "greater_than": 10 
    }, 
    }, 
    "selected": [1,2 3, 4] 
} 

現在,您可以將JSON文檔保存在一個數據庫中,該數據庫不一定是,但可能與保存停車數據的數據庫相同。您可以將它同樣存儲在文件數據庫中。您希望在該數據庫中包含與應用程序和查詢的使用有關的數據,諸如保存搜索的用戶,會話ID,保存的時間戳等等。在這種方法中,不用擔心將搜索鏈接到完成搜索時存在的數據集。

另一種方法是保存搜索時選擇的行中的所有標識符。我認爲這有點問題。如果數據庫中的標識符發生變化,並且右側標識不再包含其餘細節的行是正確的呢?如果某人選擇一個入口,因爲它位於給定建築物的特定樓層上,現在不再是了?

無論如何,在這種情況下,如果您確定標識符仍然引用相同的數據,您可能只想保存一個ID列表。在SQL中執行此操作的方式可能如下所示:使用用戶標識創建表save_search,保存時間等。然後創建兩個「關聯表」:

CREATE TABLE saved_search_parking 
(
    saved_search_id int, 
    parking_id int, 
    CONSTRAINT uc_saved_search_parking UNIQUE (saved_search_id, parking_id) 
) 

和類似的表saved_search_living_area。對於保存的搜索中的每個停車點,您都會在表格中創建一個連接它們的行。一個保存的搜索包含多個停車,一個停車可以包含在多個保存的搜索中。這確實意味着您可以在保存的搜索中同時存放停車位和生活區。但是,與其他設計相比,我認爲這是一個小缺點。在任何情況下,將保存的搜索加載到「停放」頁面的代碼只應查看saved_search_parking表格,並且與「生活區域」頁面相同。

+1

終於有值得研究的東西。謝謝@ jwg –

0

你的過濾器需要運行生成表查詢,將保存在一個新表中的結果。然後,您可以根據需要將結果發送到報告或電子郵件。關鍵是生成表查詢。