0

想要规范化和优化此表格'table1'真的很感谢。我现在可以执行以下查询:关于表格标准化的帮助

SELECT user AS users 
FROM table1 
WHERE project='Project B' 
AND doctype='DocType B' 

得到我想要的东西,但我觉得它不是很有效,想就如何改善帮助(解释)。

最后我想实现以下目标:
1)打破这个1台到多个表,便于鉴于“项目”和“DOCTYPE”维护
2)的,退还所有用户

表1:

project  doctype  user 
-------  -------  ---- 
Project A DocType A User A 
Project A DocType A User B 
Project A DocType A User C 
Project A DocType A User D 
Project A DocType B User A 
Project A DocType B User C 
Project A DocType B User D 
Project A DocType C User B 
Project A DocType C User D 
Project B DocType A User B 
Project B DocType A User E 
Project B DocType A User F 
Project B DocType A User G 
Project B DocType B User A 
Project B DocType B User C 
Project B DocType B User E 
Project B DocType B User H 
Project B DocType C User A 
Project B DocType C User I 

请让我知道是否需要更多信息来帮助。 谢谢。

+0

我对数据库了解不多,但对我来说已经很不错了。你的表已经是BCNF了,你的查询非常简单。 – Owen

+0

@Owen:表格看起来像是“全部关键”。所以,5NF。 (没有非关键依赖关系,因为没有非关键列。) –

+0

@Catcall查看数据看起来像User + DocType-> Project,但这可能是巧合。 – Owen

回答

5

由于表是'全键',并且由于没有重复,因此没有明显的方法通过归一化来减少表。你可能会创建3个带有成对列的表格:PD,PU和DU(使用列的首字母组成表格名称)。但是由于用户A与项目A上的DocType A关联,但与项目B上的DocType A关联,因此在此示例中不起作用。

5

标准化不是为了便于维护而拆分表格。关于提高性能也没有正常化。它是以关系方式表示逻辑事实,以最小化冗余和数据异常。如果你想正确地了解标准化,请阅读C. J. Date的SQL and Relational Theory

我会坚持单个表,但添加一个索引。一些品牌的RDBMS支持索引只有查询,即如果查询可以检索索引数据结构内所需的列,则它可以跳过完全查询基表。 Microsoft SQL Server和MySQL是支持仅索引查询的数据库的显着示例。

所以我建议在三列(项目,文档类型,用户)上创建一个索引,看看是否改善了您的查询性能。