La última columna image_hash contiene hash de imagen de archivos de imagen ( varchar ).
Mi objetivo es crear una restricción única en esta columna, pero debe seguir una condición específica.
Por ejemplo, si image_hash 1 e image_hash 2 son iguales, entonces la similitud es 1
Si son completamente diferentes - similitud →0
Por similitud, supongo que la diferencia de Hamming debería encajar bien.
La condición es:
Si la diferencia de similitud entre image_hash 1 y image hash 2 es menor que X (por ejemplo, 0.1), entonces los hash se consideran iguales y esto sería una violación de unicidad.
Si la similitud es mayor que X, entonces no se viola la restricción única.
Yo he tratado :
SELECT image_hash, similarity(image_hash, '00041dffff101800') AS sml FROM archives_imagemodel WHERE id=431Pero es demasiado sensible y todavía no sé cómo convertirlo en una restricción única.
Soy malo en Postgres, así que lo siento si la pregunta es tonta o está fuera de la realidad.
¿Algunas ideas?
Gracias
Eso es posible en principio, pero requeriría escribir una extensión en C que proporcione:
Un operador de similitud que implementa la distancia de Hamming. TRUE si de manera similar excede el umbral.
Una clase de operador GiST para text que admite el operador.
Luego puede crear una restricción de exclusión utilizando ese operador, que haría exactamente lo que desea. Pero ten en cuenta que tendrías que sumergirte en las entrañas de PostgreSQL para eso (pero no tendrías que modificar el servidor).
Un enfoque más mundano sería usar un disparador, pero sin un índice GiST como se describe anteriormente, eso significaría un escaneo secuencial para cada modificación de datos, lo que mataría el rendimiento. Además, a menos que utilice el nivel de aislamiento SERIALIZABLE , dichos disparadores están sujetos a condiciones de carrera .