データベーススペースを節約するための小さなテクニック
Webサイトや管理ソフトウェアの開発では、多くの選択肢に遭遇することが多い.例えば、ユーザは、自分が受信したいメールタイプを設定することができる1:受信しない2:自分のfollowのブログの更新情報を受信する3:ニュースを受信する4:個人情報を受信する.
この時、私たちは伝統的な方法を選ぶことができます.次のような文字列定数を定義します.
public static final String EMAIL_OPTION_NEVER = "NEVER";
public static final String EMAIL_OPTION_FOLLOWED = "FOLLOWED";
public static final String EMAIL_OPTION_NEWS = "NEWS";
public static final String EMAIL_OPTION_PERSONAL = "PERSONAL";
対応するJSFページは以下の通りです.
<h:selectManyCheckbox id="optionsCheckbox" value="#{consumerAccountAction.emailOptionList}" layout="pageDirection" onclick="clickOptionCheckbox();">
<f:selectItem itemLabel="#{messages['label_emailoption_never']}" itemValue="NEVER"/>
<f:selectItem itemLabel="#{messages['label_emailoption_news']}" itemValue="NEWS" />
<f:selectItem itemLabel="#{messages['label_emailoption_followed']}" itemValue="FOLLOWED" />
<f:selectItem itemLabel="#{messages['label_emailoption_personal']}" itemValue="PERSONAL" />
</h:selectManyCheckbox>
データベースにemail_というテーブルのフィールドがあるとします.options.このようにユーザが2,3を選択すると、email_optionsに格納されているデータは「FOLLOWED,NEWS」である可能性があります.
実際にユーザーにメールを送るときは、if(emailOption.indexOf(EMAIL_OPTION_NEVER)!=-1)
上記の従来のソリューションでは問題ありませんが、データベースに格納されているデータは容量が多すぎます.占有スペースを大幅に削減する方法があり、ビジネスロジックも複雑ではありません.
定数の再定義(定数は2の次数で増加):
public static final String EMAIL_OPTION_NEVER = "1";
public static final String EMAIL_OPTION_FOLLOWED = "2";
public static final String EMAIL_OPTION_NEWS = "4";
public static final String EMAIL_OPTION_PERSONAL = "8";
フィールドemail_optionsに格納されている値はFOLLOWED|NEWSであり、判断の際にif((emailOption&EMAIL_OPTION_NEVER)!=0).
'|'と'&'はビット演算子です.具体的にはgoogleに行ってもいいです.このように、データベースに格納されているのは1つの数字だけで、長い文字列よりもスペースが少なくなります.