私はPHP+MySQLで小さなアプリケーションを作成していて、それに関連付けられたフラグが2つ(これまでのところ8つありますが、増えるとは予想されていません)のオブジェクトが存在するようになりました。意味をなさないいくつかの組み合わせがありますが、フラグはほとんど無関係です。オブジェクトはDB内の行を表します(それを保存/ロードするためのいくつかのメソッドもあります)ので、質問はストレージメソッドの選択にも当てはまります。
問題は、コードとDBの両方でそれらを最もよく表現する方法です。私はいくつかの方法を考えることができます:
それらをDBに格納する1つの方法は、ビット単位のフラグとして単一の整数フィールドに格納することです。PHP側では、それらを表現するいくつかの方法を想像できます。
- 整数値をエクスポートして、いくつかのフラグ定数を定義するだけです。フラグが必要なすべての場所に独自のビット単位の魔法を実行させます。
- クラスメソッドを定義
GetFlag()
しSetFlag()
ますUnsetFlag()
。これは、プライベート整数変数に対してビット単位の魔法を実行します。これらのメソッドには、フラグ定数の1つがパラメーターとして渡されます。 - メソッドなどを定義
GetFlagA()
しますGetFlagB()
(対応するSetおよびUnsetとともに)。 - それぞれが1つのフラグを表す一連のメンバー変数を定義します。DBからのロード時にそれらを設定し、保存時にそれらを収集します。
- すべてのフラグ値の配列であるメンバー変数を作成します。各フラグにアクセスするための配列インデックスとして事前定義された定数を使用します。また、ロード/保存時にアレイを埋める/収集します。
もう1つの方法は、それらを個別のBITフィールドとしてDBに格納することです。PHPでは、これはいくつかのメンバー変数に変換されます。私見これはクエリを複雑にします。
そして最後の方法は、すべてのフラグに別のテーブルを定義し、フラグと元のオブジェクト間の多対多の関係に中間テーブルを定義することです。私見は、他の方法では3つのテーブルしかないことを考えると、すべてのソリューションの中で最も厄介です。
私はPHPの開発をあまり行っていないので、ベストプラクティスがどうなるかわかりません。C#では、おそらくそれらをビット単位のフラグとして格納し、プライベート整数に対してビット単位の魔法を実行するプロパティを作成します。しかし、PHPにはプロパティがありません(私は最新の安定バージョンを使用しています)...