Имам таблица на работа със същото нещо, много колони и 1000 различни начина за избор. Това е кошмар. Открих обаче, че има определени комбинации от филтри, които се използват често. Това са тези, за които бих създал индекси и бих оставил другите, които рядко се използват, да работят бавно. В MSSQL мога да стартирам заявка, за да ми покаже най-скъпите заявки, които са били изпълнени към базата данни, mySQL трябва да има подобно нещо. След като ги имам, създавам индекс, който покрива колоните, за да ги ускоря. В крайна сметка ще го покриете 90 процента. Аз лично никога повече не бих проектирал подобна маса, освен ако не бях насочил AK47 към мен. (моите индекси са 3 пъти по-големи от данните в таблицата, което е много неудобно, ако трябва да добавите група или записи). Въпреки това не съм сигурен как бих препроектирал таблицата, първата ми мисъл ще бъде да разделя таблицата на две , но това би допринесло за главоболия другаде.
Потребителска таблица (потребителско име, име)
1, Lisa
2, Jane
3, John
Таблица с потребителски атрибути (UserID, AttributeName,AttributeValue)
1, EYES, Brown
1, GENDER, Female
2, EYES, Blue
2, GENDER, Female
3 EYES, Blue
3, GENDER, Male
Това би направило идентифицирането на атрибути по-бързо, но заявките ви не биха били толкова лесни за писане.
SELECT UserID, COUNT(*) as MatchingAttributes
FROM UserAttributes
WHERE (UserAttributes.AttributeName = 'EYES' AND UserAttributes.AttributeValue = 'Blue') OR
(UserAttributes.AttributeName = 'GENDER' AND UserAttributes.AttributeValue = 'Female')
Това трябва да върне следното
UserID, MatchingAttributes
1, 1
2, 2
3, 1
Всичко, което трябва да направите тогава, е да добавите HAVING COUNT(*) =2 към заявката, за да изберете само идентификаторите, които съвпадат. Изборът е малко по-ангажиращ, но също така дава добра функция, да кажем, че филтрирате по 10 атрибута и връщате всички, които имат 10 съвпадащи. Страхотно, но кажете, че нито едно не съвпада на 100%. Може да се каже, хей, не намерих нищо, което да съвпада, но тези имаха 9 от 10 или 90% съвпадение. (просто се уверете, че ако търся синеока блондинка, не получавам съобщение, че не е намерена, но ето следващите най-близки съвпадения, съдържащи синеоки блондинки със съвпадащ резултат от 60%. Това би бъде много неудобно)
Има още неща, които трябва да бъдат разгледани, ако решите да разделите таблицата, като например как да съхранявате атрибути като числа, дати и текст в една колона? Или това са отделни таблици или колони. Няма лесен отговор нито в двата случая, нито в широка маса, нито в разделени маси.