Postgres中具有Hamming差异的唯一约束

时间:2020-06-16 17:12:51

标签: postgresql

最后一列image_hash包含图像文件(varchar)的图像哈希。

我的目标是在此列上创建唯一约束,但它应遵循一个特定条件。

例如,如果image_hash 1和image_hash 2相同-则相似度为1

如果它们完全不同-相似度→0

出于相似性考虑,我认为汉明差异应该很合适。

条件是:

如果image_hash 1和image hash2的相似性差异小于X(例如0.1),则哈希被认为是相同的,这将违反唯一性。

如果相似度大于X,则不违反唯一约束。

我尝试过:

SELECT image_hash, similarity(image_hash, '00041dffff101800') AS sml
FROM   archives_imagemodel
WHERE id=431

但这是敏感的方法,我仍然不知道如何将其转换为唯一约束。

我在Postgres中表现不佳,因此,如果问题很愚蠢或不切实际,对不起

有什么想法吗?

谢谢

enter image description here

1 个答案:

答案 0 :(得分:1)

从原则上讲这是可能的,但需要使用C语言编写一个扩展程序,以提供:

  • 实现汉明距离的相似性运算符。如果相似地超过阈值,它将返回TRUE

  • text的GiST运算符类,支持该运算符。

然后,您可以使用该运算符创建排除约束,该约束将完全满足您的要求。但是请注意,您必须为此而沉浸在PostgreSQL的内部(但是您不必修改服务器)。

一种更普通的方法是使用触发器,但是如果没有如上所述的GiST索引,则意味着需要对每个数据修改进行顺序扫描,这会降低性能。此外,除非您使用SERIALIZABLE隔离级别,例如triggers are subject to race conditions