В моем приложении BugTracker.NET я предполагаю, что ошибок не будет слишком много. Может, десятки тысяч, но не десятки миллионов. Это предположение позволяет мне кэшировать теги и идентификаторы элементов, на которые они ссылаются.
В базе данных теги сохраняются по мере их ввода вместе с ошибками в текстовое поле с разделителями-запятыми.
Когда поле тега добавляется или изменяется, запускается фоновый поток, который выбирает все идентификаторы ошибок и их теги, анализирует текст и строит карту, где ключ является тегом, а значение представляет собой список всех идентификаторов, имеющих этот тег. . Затем я кэширую эту карту в объекте приложения Asp.Net.
Ниже приведен код, который я только что описал.
Код можно оптимизировать так, чтобы вместо устранения всех ошибок он просто постепенно изменял кешированную карту, но даже не оптимизировал ее, она работала нормально.
Когда кто-то выполняет поиск с использованием тега, я ищу значение на карте, получаю список идентификаторов, а затем извлекаю эти ошибки с помощью SQL с предложением «where id in (1, 2, 3 ...)».
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;
}
person
Corey Trager
schedule
05.10.2008