此问题可以归结为:
求属性集X(X包含于U)关于U上的函数依赖集F的闭包,判断此闭包是否等于U
输入:X,F
输出:F是否是候选码
步骤:
1 令X(0)=X,i=0
2 求B,这里B={A | (存在V)(存在W)(V->W 属于F 并且 V包含于X(i) 并且 A属于W)};
3 X(i+1) = B 加上 X(i)
4 判断X(i+1)是否等于X(i)
5 若否,则使用i+1来取代i,返回第二步
6 相等,则X(i)就是所求闭包,若此闭包=U,则F是侯选码之一。 算法终止。
将F穷举,就可以得到所有的候选码。

解决方案 »

  1.   

    3年前我尝试这样做,当时手头还有教科书的算法,用c语言来实现后,却得不到理想的结果。
    当时的目的是为了至少要实现3NF,后来放弃了,因为那样不现实。主要是依赖关系很多很杂。其实不一定要用计算机来实现。数据库设计很大部分是经验。根据需求分析的结果进而是分析的结果得到数据模型,手工分步优化数据库,从1NF到2NF到3NF。同时考虑系统的性能。有时为了提高性能不惜牺牲规范。我认为技术仅是一种手段。太追求它反而觉得迷茫。