0

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

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

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

...等等直到找到一个密钥?

4

1 回答 1

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

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

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

于 2017-06-29T21:29:56.590 回答