Хранение флагов в базе данных SQL и работа с ними в Symfony - PullRequest
0 голосов
/ 28 мая 2011

У меня есть набор объектов в БД, с которыми может быть связано несколько логических флагов.

Флаги будут предварительно определены, но возможно флаги могут быть добавлены или удалены позже.Я мог бы сохранить их в таблице с FlagID и FlagName.

. Сохранять значения этих флагов легко - их можно сохранить в простой таблице, содержащей ObjectID и FlagID -запись в этой таблице будет указывать флаг 'set'.

Если бы я тогда сделал запрос с объединением, было бы легко извлечь Objects с их флагами 'set'.

Но моему приложению Symfony (использующему Doctrine в качестве ORM) необходимо получить все «неустановленные» значения в этом соединении, чтобы оно могло предлагать флажки для их установки - то есть идеальный вывод будет

ObjectID FlagID Value
1        1      True
1        2      False
2        1      False
2        2      False
3        1      False
3        2      True

Этот набор результатов будет результатом следующих данных в базе данных

ObjectID FlagID
1        1
3        2


FlagID   FlagName
1        Foo
2        Bar

Таким образом, мне не нужно хранить все неустановленные флаги для каждого объекта, и, таким образом, мне не нужно беспокоиться о-популяция таблицы с неустановленными флагами при каждом добавлении флага.

Есть ли запрос, который сгенерирует этот набор результатов?

Ответы [ 2 ]

2 голосов
/ 28 мая 2011

Вам нужно что-то вроде этого:

select object.id,
       flags.id,
       object_flags.flag_id is null as has_flag
from objects
cross join flags
left join object_flags
on object_flags.object_id = objects.id
and object_flags.flag_id = flags.id
0 голосов
/ 29 мая 2011

другое решение будет использовать 8-байтовое целое число, которое даст вам до 64 флагов, которые вы можете получить сразу. это избавит вас от необходимости извлекать несколько записей и читать каждое поле.

См Самый эффективный способ извлечь битовые флаги

Лучшие практики для битовых флагов в PHP

...