2013-08-17 56 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表中。