在SQL数据库中存储标志并在Symfony中使用它们

时间:2011-05-28 12:59:29

标签: sql database symfony1 doctrine schema-design

我在DB中有一组对象,它们可以有许多与之关联的布尔标志。

标志将是预定义的,但可能会在以后添加或删除标志。我可以将它们存储在包含FlagIDFlagName的表格中。

存储这些标志的值很简单 - 它们可以保存在包含ObjectIDFlagID的简单表中 - 此表中的条目将指示“设置”标志。

如果我然后使用连接进行查询,则可以很容易地使用“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存储所有未设置的标志,因此无论何时添加标志,我都不必担心使用未设置的标志预先填充表。

是否有生成此结果集的查询?

2 个答案:

答案 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个标志,你可以一次获取。它将消除获取多个记录和阅读每个字段的麻烦。

参考 Most efficient way to extract bit flags

Best practices for bit flags in PHP