Я бы использовал одну таблицу
tags(id,name,type,expression,order)
- type покажет, является ли тег нормальным или вычисленным.
- Порядок переупорядочивается при добавлении новых вычисляемых тегов, он определяет порядок расчета для этих тегов ...
- выражение перед вставкой строки анализируется и проверяется, его также можно создать с помощью графического интерфейса пользователя (что-то вроде того, как Oracle Discoverer делает это).
- Вы связываете только обычные теги с элементами
Для вашего примера подержанные товары должны быть рассчитаны до предложения подержанных товаров, все остальные могут быть рассчитаны без каких-либо зависимостей.
1,'new',1,'',NULL
2,'for_sale',1,'',NULL
3,'used',1,'',NULL
4,'offer',1,'',NULL
5,'second_hand_goods',2,'(!new or used) and for_sale',1
6,'new_offer',2,'new and offer',1
7,'second_hand_offer',2,'second_hand_goods and offer',2
Элемент может быть помечен только for_sale, вычисление даст:
second_hand_goods,second_hand_offer
У меня была бы функция, которая выдает список всех тегов для элемента, включая прямые и вычисленные теги:
for_sale,second_hand_goods,second_hand_offer