【问题标题】:Algorithm to find Candidate key without Functional Dependencies寻找没有功能依赖的候选键的算法
【发布时间】:2017-06-29 21:04:30
【问题描述】:

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

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

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

... 以此类推,直到找到密钥?

【问题讨论】:

  • 你是什么意思,“没有已知的功能依赖”?那是不对的,总是有微不足道的FD。你的意思是,没有非平凡的 FD 持有?你为什么这么说?你到底给了什么? (你确定?这意味着没有给定的超级键、CK、PK 或 UNIQUE,因为这些暗示某些 FD 持有和不持有。)那么它唯一的 CK 是所有属性的集合。你的意思是,他们可能持有但你不知道?您需要能够确定为找到 CK 而持有的所有 FD 的集合。所有属性的集合始终是一个超级键。你是什​​么意思,“检查”?你希望如何做到这一点?

标签: sql algorithm candidate-key


【解决方案1】:

表的主键必须是唯一的。如果您的数据集随着时间的推移而增长,那么检查列现在是否唯一是不够的。它们必须永远独一无二。所以在这种情况下,我会避免自然 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

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

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

【讨论】:

  • 感谢您的回复。澄清一下:数据集没有增长,我确信有一个自然键,但不知道是哪个。我知道整个检查是否没有。一组列中不同值的个数等于否。表中不同的行并使用乘法标准进行优化,但是当您检查更大的子集时,组合的数量会越来越多。此外,虽然我没有提到它,但我想在多个表(大约 100 个)上执行此操作,因此需要一种算法,它比我描述的“蛮力”方式更有效地找到密钥,而无需我检查个人表。
猜你喜欢
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
相关资源
最近更新 更多