ちょっとした気の迷いでint配列型のカラムを使うことにした。
普段、配列型のカラムは使わず、正規化してテーブルを分けることがほとんどだった。
配列型カラムについての簡単なまとめ
PostgreSQLで配列型のカラムを使ってみる
http://d.hatena.ne.jp/pasela/20070301/postgresql
公式Documentでは以下のような警告が…
ティップ: 配列は集合ではありません。特定の配列要素に検索をかけることはデータベース設計が誤っている可能性を示唆しています。配列の要素とみなされるそれぞれの項目を行に持つ別のテーブルを使うことを検討してください。この方が検索がより簡単になり要素数が大きくなっても拡張性があります。
http://www.postgresql.jp/document/pg823doc/html/arrays.html
嫌な予感しかしないが、とりあえずやってみた。
- int配列
array(0,1,1,2,3,5)
をカラムに格納したい
{0,1,1,2,3,5}
という 文字列 に変換してinsertしなければいけない。
public static function toIntArray($values)
{
if (is_array($values)) {
return '{' . implode(',', $values) . '}';
}
return null;
}
- カラムに格納されたint配列をfetchしたい
fetchすると、なんと{0,1,1,2,3,5}
という 文字列 が返ってきてしまう。
したがって、{}
でtrimしてからexplodeすることが必要になる。
public static function fromIntArray($value)
{
$value = trim($value, '{}');
if (strlen($value) === 0) {
return [];
}
$values = explode(',', $value);
return array_map(function ($v) {
return intval($v);
}, $values);
}
もし、int配列ではなくstring配列が欲しい場合、intval($v)
をstrval($v)
に書き換えるだけ。
「正規化して別テーブルに書いたほうがいいのは明らかなんだけど、たった数個のカラムのテーブルを作る抵抗感…」というときには悪くないかもしれない。やや注意が必要という話。