0

DB に一連のオブジェクトがあり、それらに関連付けられた多数のブール値フラグを持つことができます。

フラグは事前定義されますが、後で追加または削除される可能性があります。FlagIDと を使用してそれらをテーブルに格納できますFlagName

ObjectIDこれらのフラグの値を格納するのは簡単です。それらは、とを含む単純なテーブルに保存できますFlagID。このテーブルのエントリは、「設定」フラグを示します。

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

このように、各オブジェクトに対して未設定のフラグをすべて格納する必要がないため、フラグが追加されるたびに未設定のフラグをテーブルに事前入力することを心配する必要がありません。

この結果セットを生成するクエリはありますか?

4

2 に答える 2

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
于 2011-05-28T13:12:34.673 に答える
0

別の解決策は、一度に取得できる最大 64 個のフラグを提供する 8 バイトの整数を使用することです。複数のレコードを取得してすべてのフィールドを読み取る手間が省けます。

ビットフラグを抽出する最も効率的な方法を参照 してください

PHP でのビット フラグのベスト プラクティス

于 2011-05-29T10:35:58.510 に答える