2012-09-06 49 views
1

假設我正在編寫供派對策劃人員使用的軟件。這就是我目前的數據庫架構的樣子:擴展應用程序設計 - 自動生成數據庫中已有的模板中的數據項

Parties (PartyId, ClientId, DateTime) 
Tents (PartyId, TentDetails...) 
Clowns (PartyId, ClownDetails...) 
SecurityAgentAssignment (PartyId, AgentId, fromTime, untilTime) 

因此,大家可以看到,一個黨可以有多個帳篷,小丑,並分配給它的安全人員。

現在,派對策劃人員通常會計劃同類型的派對:​​大多數派對有一個帳篷,一個小丑,沒有安全感;但也有另一種常見類型的派對,有三個帳篷,沒有小丑,還有三名安全代理參加派對。他們希望能夠存儲「預設」(也稱爲「派對包」或「派對模板」),當選定時將在數據庫中添加必要的Tent,Clown和Security行。派對仍然可以像平常一樣進行定製,當然,這只是最小化初始數據錄入的一種手段。

現在的問題是,我將如何實現這個?

最直接的方法是使TentsClownsSecurityAgentAssignment表的副本,並添加一個新的Packages表,如下圖所示:

Packages (PackageId, Name) 
Package_Tents (PackageId, TentDetails...) 
Package_Clowns (PackageId, ClownDetails...) 
Package_Security (PackageId, AgentId) 

的BIZ邏輯則必須創建Tent行從Package_Tent行開始,不能通過INSERT INTO SELECT FROM語句完成,因爲兩個模式不同(例如,Package_Security缺少fromTimeuntilTime字段)。

這種方法簡單有效,但是它有幾個問題:

  1. 它意味着複製表的負擔只是爲了包裝系統。這就是項目如何膨脹的表現。
  2. 它引入了一個額外的維護層:如果我修改原始表,然後我必須修改這些。
  3. 它似乎在某種程度上「錯誤」。

的第二種方法是指使用現有的表,但添加單個新的表如下所示:向現有Party

Packages (PackageId, Name, PartyId) 

Packages錶鏈接(和其相關聯的帳篷,小丑和安全行)。它所鏈接的締約方是不存在的(或者更確切地說,它的細節無關緊要),它變成了新組織的模板,它只需要在單個表中複製行而不是從另一個表的新表中創建行表。這種方法還具有允許用戶使用現有的GUI將Package修改爲原型方而不是具有單獨的GUI工具/區域的優點。

然而,它受到「不純正」的影響:現在黨的國家如何作爲「政黨」而不是「政黨模板」取決於其在Packages表中的外鍵。這也意味着將存在無效或無意義的數據(例如,在聚會模板中將fromTimeuntilTime用於安全性沒有意義)。

StackOverflow是否支持一種方法,還是有第三種方法?

回答

1

與第二種方法一起使用絕對有意義。每種設計都有其優點和缺點,但第二種方法(重用架構和GUI)的優點遠遠超過了任何小問題。

就個人而言,我不認爲任何你所提到的是「雜質」架構中的問題,而他們是需要進行應用程序明確,例如公務約束:

  • 如果編輯方模板,忽略fromTimeuntilTime,並在GUI
  • 隱藏這些編輯是否定期聚會,確保fromTimeuntilTime有效
0

方式我看到它,模板就是這樣,模板:預設。您可以將預設值存儲爲xml。讓您在範圍廣泛的情況下更改模板而不會破壞表格結構,只有應用程序代碼需要在運行時處理解析和翻譯xml。這裏唯一的缺點是如果模板變得太大,xml可能變得難以管理。但是對於中小尺寸的應用和有效的DAO/ORM層,您的配置可以很好地與 Party_Template(template_id,template_title,template_desc

+0

有趣的角度。 – Dai

相關問題