我有一个包含4个表的数据库,每个表有大约20列。我要确定整个数据库是否符合BCNF。我假设第一步是找到功能依赖,但我不知道如何做到这一点,有这么多列!正确的方法是什么?
答案 0 :(得分:1)
最简单的方法是购买支持逆向工程的计算机辅助软件工程(CASE)工具。这些工具可以检查SQL数据库,并从现有表中生成每个可能的5NF模式。我想,我在20世纪80年代第一次看到这样的工具;我不知道哪些仍然可用。
如果你自己做,那么是的,你必须首先确定所有的功能依赖。您必须知道每列的含义才能可靠地执行此操作。如果你知道每一列的含义,并且你知道业务环境,你可以通过查看列名来确定许多函数依赖项,如果不是全部的话。
如果您不了解每一栏的含义,前进的方向仍然很简单,但这并不容易。
简单:使用SQL,查询不同值的每个可能的列组合,并计算行数。如果两组列之间存在功能依赖关系,则它们将返回相同数量的行。你还是要看看意思; 可能巧合地获得相同数量的行。
不容易:列的组合有批次。对于20列的表,大约有一百万种组合。 (如果我必须这样做,我会编写一个程序来生成所有SQL语句,并将它们的结果存储在一个表中以供以后分析。)
更难的部分
在一般情况下,您无法知道表之间是否存在之间的功能依赖关系,这些依赖关系是迄今为止由应用程序代码创建和维护的。 (您的特定情况可能会有所不同。)可能是其中一些列位于错误的表中,但该应用程序代码将所有内容放在一起。
我想到了combinatorial explosion这个短语。每个20列的四个表,不知道其含义或商业环境,为您提供大约1.2x10 24 组合进行测试。那不实用;你 通过理解列的含义来缩小范围,或者只是忽略了表间依赖的可能性,直到你有一个更好的结构开始。