У вас есть несколько вариантов (без каламбура). Для рекомендаций по возрасту самый простой способ - сохранить min_age и max_age и выполнить запрос следующим образом:
select * from item where :age between min_age and max_age
где вы должны решить, разрешить ли вам пустые значения для этих столбцов (тогда вам нужно использовать coalesce () или nvl () или любую другую функцию, которую ваша база данных предоставляет для сравнения с нулевыми значениями), или установить граничные значения для этих столбцов, где Вы можете быть уверены: возраст всегда будет между ними.
В качестве альтернативы вы можете использовать таблицу m: n
create table item_ages (item_id int not null, age int not null, constraint item_ages_pk primary key (item_id, age)
и заполните его явными значениями:
item_id | age
-------------
1 | 16
1 | 17
1 | 18
и т. Д. Это более громоздко, чем использование диапазона, но также и более гибко, и, поскольку ваша база данных может индексировать таблицу и, вероятно, хранить этот индекс в памяти, запросы должны быть быстрыми. Эту таблицу нужно трогать только при вводе нового элемента или изменении возрастного диапазона для определенного элемента.
Обратите внимание, что ответ CBRRacer имеет схожие свойства: оба разделяют идею о том, что вы готовите структуру данных, которую можно легко проиндексировать, и отвечаете на вопрос фильтра из этого индекса. Это популярный метод хранения маркетинговых данных в приложениях электронной коммерции. Крайним концом этого диапазона будет использование специального пакета для хранения инвертированных индексов для этой цели. Но для простой рекомендации по возрасту это, конечно, излишне.