En mi aplicación BugTracker.NET, hago una suposición de que no habrá demasiados errores. Tal vez decenas de miles, pero no decenas de millones. Esa suposición me permite almacenar en caché las etiquetas y los identificadores de los elementos a los que hacen referencia.
En la base de datos, las etiquetas se almacenan a medida que se ingresan, con los errores, en un campo de texto delimitado por comas.
Cuando se agrega o cambia un campo de etiqueta, se inicia un hilo de fondo que selecciona todos los errores y sus etiquetas, analiza el texto, crea un mapa donde la clave es la etiqueta y el valor es una lista de todos los identificadores que tiene esa etiqueta. Luego guardo en caché ese mapa en el objeto Asp.Net Application.
A continuación se muestra el código que acabo de describir.
El código podría optimizarse para que en lugar de pasar por todos los errores modificara gradualmente el mapa en caché, pero incluso sin optimizar, funciona bien.
Cuando alguien hace una búsqueda usando una etiqueta, busco el valor en el mapa, obtengo la lista de identificadores, y luego obtengo esos errores usando SQL con "where id in (1, 2, 3 ...) "cláusula.
public static void threadproc_tags(object obj)
{
System.Web.HttpApplicationState app = (System.Web.HttpApplicationState)obj;
SortedDictionary<string,List<int>> tags = new SortedDictionary<string,List<int>>();
// update the cache
DbUtil dbutil = new DbUtil();
DataSet ds = dbutil.get_dataset("select bg_id, bg_tags from bugs where isnull(bg_tags,'') <> ''");
foreach (DataRow dr in ds.Tables[0].Rows)
{
string[] labels = btnet.Util.split_string_using_commas((string) dr[1]);
// for each tag label, build a list of bugids that have that label
for (int i = 0; i < labels.Length; i++)
{
string label = normalize_tag(labels[i]);
if (label != "")
{
if (!tags.ContainsKey(label))
{
tags[label] = new List<int>();
}
tags[label].Add((int)dr[0]);
}
}
}
app["tags"] = tags;
}
cómo evitar personas que no usan el mismo nombre para una etiqueta (como sensibilidades de casos, etc.) – leora
@akantro: proporcióneles una lista de etiquetas para animarlas a elegir una en lugar de escribir una nueva. O el equivalente moderno, un cuadro de texto con finalización de etiqueta impulsada por AJAX. –
¿existe un control preconstruido para la finalización de la etiqueta impulsada por AJAX? – leora