2015-10-01 23 views
3

我有兩個表連接表,以允許多對多的關係。是否有減少重複連接表數據的數據庫設計模式名稱?

enter image description here

這是一個非常熟悉的設計模式。它指示每個成員有權訪問哪些分支。

隨着成員和分支數量的增加,我最終在成員中重複的連接表中獲得了大量數據。成員傾向於與其他成員訪問相同的分支組。

所以我正在通過創建一個有效的不可變的MemberProfile表來規範我的數據。而不是爲每個會員創建MemberBranch記錄,我檢查匹配的MemberProfile,如果它已經存在則使用,或者創建一個,如果它不存在:

想法是如果我有一百萬會員只有一百個訪問配置文件這將爲我節省大量的數據庫空間。

enter image description here

我很高興,所有的工作和發展的努力是值得的。

我的問題是「這是一個標準的數據庫設計模式,如果是的話,它叫什麼?」

編輯:有人指出,這是壓縮數據沒有正常化它。這是設計背後的意圖。

+7

你說過了,這就是所謂的正常化。 – Blindy

+0

@Bindy或「正常化」,如果你想要更精確;) – Barranka

+2

數據庫擅長存儲數百萬行和(提供你適用體面的索引)仍然獲得良好的性能。在做這件事之前,我想確認這是值得的。您是否還將執行清理活動(例如,刪除任何人不再使用的配置文件)?如果空間真的是一個問題,我還會研究我的數據庫產品是否提供任何本機壓縮選項。 –

回答

2

我知道您希望爲該精確轉換添加標籤,但不幸的是,沒有多少書籍討論數據庫設計或重構模式。少數人之一是馬丁福勒的Refactoring Databases,你可能知道他在分析模式方面的工作(他也有一個偉大的blog,值得關注!)。在這本書中,Martin介紹了一系列可應用於數據庫的重構模式,併爲常見數據庫轉換(包括您提供的數據庫轉換)命名,他稱爲分割表

拆分表。將現有表格垂直分割(例如按列)到一個或多個表格中。

Split Table

在這本書中介紹的數據庫重構的目錄可here

4

除非你的很多:許多表總是特定其他基表的連接,一個是而不是正常化。你在這裏沒有正常化。規範化不會引入新的列名稱。它只是在不同的基表中重新排列當前的。

你只是壓縮/編碼你的數據。這並不一定有好處,因爲現在有些查詢和更新會比較慢,儘管數據庫較小。 (你已經報道過它是值得的在你的情況下。)

+0

是的,你現在正在壓縮數據而不是正常化它。 –

1

嗨我不知道模式名稱,但我曾經使用過相同的原則。 爲了保持良好的性能,請根據配置文件的分支向memberProfile引入校驗和,這樣對現有配置文件的查找就變得簡單快捷。

但是請記住,校驗和不一定是唯一的,如果發生衝突,您仍然必須檢查分支,但僅限於共享相同校驗和的配置文件。

清理可以是一個計劃任務是沒有什麼更多然後刪除配置文件沒有用戶。

+0

謝謝,我已經確定需要使用校驗和或散列來執行查找,並且需要某種預定的清理。我將它從示例中刪除,以免分散注意力:) –