Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@ogugu9

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

More than 3 years have passed since last update.

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

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

7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ogugu9
本業はバックエンドエンジニアでJavaを書いてます。最近はReact+TypeScriptの勉強とPythonで機械学習はじめました。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?