给定一个包含数十列的表,数千行并且列之间没有已知的函数依赖关系,是否有任何算法可以自动为该表找到比这更快或更高效的候选键:
检查是否有任何2列是候选键
检查是否有3列是候选键
... 等等,直到找到钥匙?
答案 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
如果表只有几千行,性能应该不是问题。
我认为你可以通过使用数据字典使其完全自动化,但我手头没有解决方案。