Мені подобається робити декілька таблиць, які представляють необроблені дані, тож у цьому випадку у вас є
Items (ID pk, Name, <properties>)
Tags (ID pk, Name)
TagItems (TagID fk, ItemID fk)
Це працює швидко в час запису і зберігає все нормалізоване, але ви також можете зауважити, що для кожного тегу вам потрібно буде двічі приєднуватися до таблиць для кожного подальшого тегу, який ви хочете зробити І, тому його читають повільно.
Рішення для поліпшення читання полягає у створенні таблиці кешування за командою, встановивши збережену процедуру, яка по суті створює нову таблицю, яка представляє дані у вирівняному форматі ...
CachedTagItems(ID, Name, <properties>, tag1, tag2, ... tagN)
Тоді ви можете розглянути, наскільки часто потрібно оновлювати таблицю з тегом, якщо вона є на кожній вставці, а потім викликати збережену процедуру в події вставки курсору. Якщо це щогодинне завдання, то створіть погодинну роботу для його виконання.
Тепер, щоб отримати дійсно розумний пошук даних, вам потрібно створити збережену процедуру для отримання даних з тегів. Замість того, щоб використовувати вкладені запити в масовому операторі регістру, ви хочете передати єдиний параметр, що містить список тегів, які ви хочете вибрати з бази даних, і повернути набір записів Елементів. Це найкраще в двійковому форматі, використовуючи побітові оператори.
У двійковому форматі це легко пояснити. Скажімо, для елемента можна присвоїти чотири теги, у двійковій формі ми могли б це представляти
0000
Якби всі чотири теги були присвоєні об'єкту, об’єкт виглядав би так ...
1111
Якби тільки перші два ...
1100
Тоді це лише випадок знаходження двійкових значень із знаками 1 та нулі у стовпці, який ви хочете. Використовуючи бітові оператори SQL Server, ви можете перевірити наявність 1 у першому стовпці, використовуючи дуже прості запити.
Перевірте це посилання, щоб дізнатися більше .