Предлагаю таблицу следующей структуры:
CREATE TABLE IF NOT EXISTS `expressions` (
`id` int(10) unsigned NOT NULL,
`rel_a` enum('self','external') NOT NULL,
`id_a` int(10) unsigned NOT NULL,
`operation` enum('and','or') NOT NULL,
`rel_b` enum('self','external') NOT NULL,
`id_b` int(10) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Где одна запись - это одна операция между двумя сущностями.
Сущностью может быть как запись с id из внешней таблицы (rel=external), так и с id из текущей (rel=self).
Разбиваем ваше выражение след. образом
- a or b
- c or d
- (1) and (2)
- (3) and e
- (4) or f
Записи в таблице:
id | rel_a | id_a | operation | rel_b | id_b |
1 | external | A | or | external | B |
2 | external | C | or | external | D |
3 | self | 1 | and | self | 2 |
4 | self | 3 | and | external | E |
5 | self | 4 | or | external | F |
где A, B, C, D, E, F - ID записей из внешней таблицы
Запись с ID=5 - будет вашим исходным выражением.