Oddzielna kolumna na wartość jest bardziej elastyczna, jeśli chodzi o wyszukiwanie.
Oddzielna tabela klucz/wartość jest bardziej elastyczna, jeśli różne wiersze mają różne kolekcje wartości logicznych.
A jeśli
- Twoja lista wartości logicznych jest mniej więcej statyczna
- wszystkie twoje wiersze mają wszystkie te wartości logiczne
- wyszukiwanie krytyczne dla wydajności polega na znalezieniu wierszy, w których którakolwiek z wartości jest fałszywa
następnie użycie ciągów tekstowych, takich jak „1001010010” itp., jest dobrym sposobem ich przechowywania. Możesz wyszukiwać w ten sposób
WHERE flags <> '11111111'
aby znaleźć potrzebne wiersze.
Możesz użyć kolumny BINARY z jednym bitem na flagę. Ale Twój stół będzie łatwiejszy w użyciu do zwykłych zapytań i kontroli gałek ocznych, jeśli użyjesz tekstu. Oszczędność miejsca dzięki użyciu BINARY zamiast CHAR nie będzie znacząca, dopóki nie zaczniesz przechowywać wielu milionów wierszy.
edytuj Trzeba powiedzieć:za każdym razem, gdy budowałem coś takiego z tablicami atrybutów logicznych, później byłem rozczarowany tym, jak nieelastyczne okazywało się to. Załóżmy na przykład, że był to katalog żarówek. Na przełomie tysiącleci flagi logiczne mogły wyglądać jak
screw base
halogen
mercury vapor
low voltage
Potem wszystko się zmienia i potrzebuję więcej flag logicznych, na przykład
LED
CFL
dimmable
Energy Star
itp. Nagle moje typy danych nie są wystarczająco duże, aby pomieścić to, czego potrzebuję. Kiedy napisałem „Twoja lista wartości logicznych jest mniej więcej statyczna”, miałem na myśli to, że nie spodziewasz się, że coś takiego jak charakterystyka żarówki zmieni się w trakcie życia Twojej aplikacji.
Tak więc osobna tabela atrybutów może być lepszym rozwiązaniem. Miałby to następujące kolumny:
item_id fk to item table -- pk
attribute_id attribute identifier -- pk
attribute_value
To jest ostatecznie elastyczne. Możesz po prostu dodać nowe flagi. Możesz dodać je do istniejących elementów lub do nowych elementów w dowolnym momencie życia aplikacji. I każdy przedmiot nie wymaga tej samej kolekcji flag. Możesz napisać "jakie przedmioty mają jakieś fałszywe atrybuty?" zapytanie w ten sposób:
SELECT DISTINCT item_id FROM attribute_table WHERE attribute_value = 0
Ale musisz być ostrożny, ponieważ zapytanie „jakie elementy mają brakujące atrybuty” jest znacznie trudniejsze do napisania.