2012-07-01 10 views
5

Digamos que tengo una lista de personas en mi almacén de datos. Cada persona allí puede tienen los siguientes campos:¿Cómo organizar correctamente la búsqueda de la persona?

  • apellido (*)
  • nombre
  • segundo nombre
  • id (*)
  • el permiso de conducir (*)
  • otro ID (*)
  • fecha de nacimiento
  • región
  • lugar de nacimiento

Al menos uno de los campos marcados con (*) deben existir.

Ahora el usuario me proporciona la misma lista de campos (y otra vez al menos uno de los campos marcados con (*) se debe proporcionar). Debería buscar la persona que el usuario me proporcionó. Pero no todos los campos deben coincidir. Debo mostrarle al usuario de alguna manera de qué manera estoy seguro en los resultados de la búsqueda. Algo así como:

  • si la persona igualada por id y last name (y proporcionado por el usuario sólo estos 2 campos para la búsqueda), entonces estoy seguro de que resultado es correcto (100%);
  • si la persona coincide con id y last name (y el usuario proporcionó otros campos, que se encontraron en la base de datos, pero no se encontraron), entonces estoy seguro de que el resultado es casi correcto en un 60%;
  • etc.

(los números se proporcionan simplemente como ejemplo)

¿Cómo puedo organizar dicha búsqueda? ¿Hay algún algoritmo estándar? También me gustaría minimizar el número de solicitudes a la base de datos.

P.S. No puedo proporcionar al usuario los valores de campo reales de la base de datos.

Respuesta

1

Parece que su lógica para determinar la calidad de una coincidencia será demasiado compleja de manejar en la capa de la base de datos. Creo que obtendrás el mejor rendimiento recuperando todos los registros que coinciden con al menos una de las claves obligatorias, calculando la puntuación del partido para cada uno de ellos en la memoria y devolviendo la mejor puntuación. Por ejemplo, si el usuario le proporciona un identificador, apellido y lugar de nacimiento, la consulta sería algo como:

SELECT * FROM users WHERE id = `the_id` OR last_name = `the_last_name`; 

Esto podría ser un problema de rendimiento si tiene un gran conjunto de datos con una gran cantidad de común apellidos pero de lo contrario esperaría no ver demasiadas colisiones. Puede verificar esto en su propio conjunto de datos fuera de GAE. También podría obtener un mejor rendimiento si TODOS los campos obligatorios DEBEN coincidir cambiando el OR a un AND.

Cuestiones relacionadas