2013-08-17 57 views
0

我必須構建一個允許完全模塊化結構的數據庫結構。我們舉一個例子,它會更容易理解。SQL可調結構冗餘

我們有一個網站記錄,看起來像這樣:

WEBSITE A 
| ----- SECTION A 
|   |-- SUBSECTION 1 
|   |  | -- Data 1 : Value 1 
|   |  | -- Data 2 : Value 2 
|   |  |  ... 
|   |  | -- Data N : Value N 
|   | 
|   |-- SUBSECTION 2 
|   |  | -- Data 52 : Value 1 
|   |  | -- Data 53 : Value 2 
|   |  |  ... 
|   |  | -- Data M : Value M 
|   | 
|   ... 
| 
| ----- SECTION B 
|   | 
|   ... 

...

模型1:

等。麻煩的是我必須實施許可制度。例如,用戶A可以訪問網站1中的A,B,D,Z部分,而用戶2可以訪問網站2中的C,V,W,X部分。 首先,我認爲將它構建爲樹最有效的方法。 這是我的第一個數據庫表示:

TABLE website (id, id_client, name, address) 
TABLE section (id, id_website, name) 
TABLE sub_section (id, id_section, name) 
TABLE data (id, id_sub_section, key, value) 

藉助這種表示,這將是很容易給員工一些受限制的訪問。 但是,這兩個網站都會有共同的數據。例如,所有網站將具有相同結構的部分A,B,C,D。這意味着大量的冗餘。對於每個網站,我們會有很多共同結構,唯一的區別將是TABLE數據中的屬性值

第二個問題是這個結構必須完全模塊化。例如,管理員應該能夠將一個部分,一個子部分或一個數據添加到網站記錄中。這就是爲什麼我認爲這種模式更容易管理的原因。

模型2:

我有一個第二個模型,更容易儲存,但難以利用:

TABLE website (id, id_client, Value 1, Value 2, Value 3 ... Value N) 
TABLE section (id, name, Data 1, Data 2, Data 3 .. Data N, ..., Data 52, Data 53, Data M) (it represents the name of the columns) 
TABLE subsection (id, id_section, name, Data 1, Data 2, Data N) 

通過這樣做,我有其中數據被存儲的表和「結構表「與這兩個網站共同的章節和小節。如果管理員想添加一個節/小節,我們要回樹結構來存儲數據的其它附加,看起來像這樣:

TABLE additional_section (id,id_website,name) 
TABLE additionnal_subsection (id,id_section, id_additional_section, name) 
TABLE additional_data (id, id_subsection, id_additionnal_subsection, key, value) 

它避免了大量的冗餘和便利的權限管理。

我的問題是:

什麼是這種應用的最佳模式?模型1?模型2?另一個 ? 感謝您的閱讀和答案!

回答

0

我建議你修改模型1.

您可以通過從該表中移除id_website FK消除section表中的冗餘度和website表和它之間創建一個新表。

這個新表WebsiteSection有一個PK由FK到website和FK到section,允許每個部分成爲多個網站的一部分。

所有網站共有的部分數據將存儲在section表中,而部分特定網站數據將存儲在WebsiteSection表中。