查找没有功能依赖关系的候选键的算法

时间:2017-06-29 21:04:30

标签: sql algorithm candidate-key

给定一个包含数十列的表,数千行并且列之间没有已知的函数依赖关系,是否有任何算法可以自动为该表找​​到比这更快或更高效的候选键:

  1. 检查是否有任何单个列是候选键
  2. 检查是否有任何2列是候选键

  3. 检查是否有3列是候选键

  4. ...  等等,直到找到钥匙?

1 个答案:

答案 0 :(得分:0)

表的主键必须是唯一的。如果您的数据集随着时间的推移而增长,那么检查列现在是否唯一是不够的。它们必须永远是独一无二的。所以在这种情况下,我会避免使用自然PK并选择代理密钥。

如果你100%确定必须有一个自然键,但你只是不知道你开始的列确定列的独特基数:

SELECT COUNT(*),
       COUNT(DISTINCT column1),
       COUNT(DISTINCT column3),
       ...
FROM table

如果对于任何列,不同数量的值等于您找到密钥的总行数。如果它是多列,您需要采用尝试错误的方法。您知道候选关键字的不同列值的乘积必须大于或等于总行数

COUNT(DISTINCT key_column1) * COUNT(DISTINCT key_column2) * COUNT(DISTINCT key_column3) >=  COUNT(*)

知道这一点你可以寻找合理的组合

SELECT COUNT(DISTINCT key_column1 || key_column2 || key_column3), COUNT(*)
FROM table

如果表只有几千行,性能应该不是问题。

我认为你可以通过使用数据字典使其完全自动化,但我手头没有解决方案。