假設我正在編寫供派對策劃人員使用的軟件。這就是我目前的數據庫架構的樣子:擴展應用程序設計 - 自動生成數據庫中已有的模板中的數據項
Parties (PartyId, ClientId, DateTime)
Tents (PartyId, TentDetails...)
Clowns (PartyId, ClownDetails...)
SecurityAgentAssignment (PartyId, AgentId, fromTime, untilTime)
因此,大家可以看到,一個黨可以有多個帳篷,小丑,並分配給它的安全人員。
現在,派對策劃人員通常會計劃同類型的派對:大多數派對有一個帳篷,一個小丑,沒有安全感;但也有另一種常見類型的派對,有三個帳篷,沒有小丑,還有三名安全代理參加派對。他們希望能夠存儲「預設」(也稱爲「派對包」或「派對模板」),當選定時將在數據庫中添加必要的Tent,Clown和Security行。派對仍然可以像平常一樣進行定製,當然,這只是最小化初始數據錄入的一種手段。
現在的問題是,我將如何實現這個?
最直接的方法是使Tents
,Clowns
和SecurityAgentAssignment
表的副本,並添加一個新的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
缺少fromTime
和untilTime
字段)。
這種方法簡單有效,但是它有幾個問題:
- 它意味着複製表的負擔只是爲了包裝系統。這就是項目如何膨脹的表現。
- 它引入了一個額外的維護層:如果我修改原始表,然後我必須修改這些。
- 它似乎在某種程度上「錯誤」。
的第二種方法是指使用現有的表,但添加單個新的表如下所示:向現有Party
行
Packages (PackageId, Name, PartyId)
這Packages
錶鏈接(和其相關聯的帳篷,小丑和安全行)。它所鏈接的締約方是不存在的(或者更確切地說,它的細節無關緊要),它變成了新組織的模板,它只需要在單個表中複製行而不是從另一個表的新表中創建行表。這種方法還具有允許用戶使用現有的GUI將Package修改爲原型方而不是具有單獨的GUI工具/區域的優點。
然而,它受到「不純正」的影響:現在黨的國家如何作爲「政黨」而不是「政黨模板」取決於其在Packages
表中的外鍵。這也意味着將存在無效或無意義的數據(例如,在聚會模板中將fromTime
和untilTime
用於安全性沒有意義)。
StackOverflow是否支持一種方法,還是有第三種方法?
有趣的角度。 – Dai