10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PostgreSQLで禁断の配列型カラムを使ってみた

Last updated at Posted at 2017-02-03

ちょっとした気の迷いで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)に書き換えるだけ。

「正規化して別テーブルに書いたほうがいいのは明らかなんだけど、たった数個のカラムのテーブルを作る抵抗感…」というときには悪くないかもしれない。やや注意が必要という話。

10
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?