我在DB中有一组对象,它们可以有许多与之关联的布尔标志。
标志将是预定义的,但可能会在以后添加或删除标志。我可以将它们存储在包含FlagID
和FlagName
的表格中。
存储这些标志的值很简单 - 它们可以保存在包含ObjectID
和FlagID
的简单表中 - 此表中的条目将指示“设置”标志。
如果我然后使用连接进行查询,则可以很容易地使用“set”标记提取Objects
。
但是我的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
这样,我不需要为每个Object存储所有未设置的标志,因此无论何时添加标志,我都不必担心使用未设置的标志预先填充表。
是否有生成此结果集的查询?
答案 0 :(得分:2)
你需要这样的东西:
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
答案 1 :(得分:0)
另一个解决方案是使用一个8字节的整数,它会给你最多64个标志,你可以一次获取。它将消除获取多个记录和阅读每个字段的麻烦。