Help us understand the problem. What is going on with this article?

SQLアンチパターン:マルチカラムアトリビュート

More than 3 years have passed since last update.

SQLアンチパターンを読み始めたので、1つ1つ書いてのメモです

目的

  • 目的:複数の値を持つ属性を格納する
  • ジェイウォーク(信号無視)と同じ。ジェイウォークでは、カンマ区切りで1つのカラムにデータを入れていた

アンチパターン

複数の列を定義する

  • tag1、tag2とか、image1、image2とか
    • やったことある

課題

  • 値の検索が複雑になる
    • tag1、tag2 を検索しなくてはいけない
  • 値の追加と削除が複雑になる
    • null のカラムを探してから update をすることになる
  • 一意性の保証ができない
    • tag1、tag2 に同じ値を入れちゃう
  • 増加する値に対応が大変
    • tag3 を増やすときには大きなテーブルになってて、ロックが必要になったり、取得用のSQLを書き換えたりする必要がある

用いてもいいパターン

  • 属性の選択肢を限定できる場合
    • tag1 には、報告者、tag2には、担当者、tag3 には、品質管理者
    • 論理的に異なる場合

解決策

  • 属性を格納する列を 1 つ持つ従属 テーブルを作成
  • ジェイウォークのときと発想は同じ

まとめ

同じ意味を持つ値は、1 つの列に格納するようにしましょう。

感想

  • やってた!
  • きちんとテーブルを分けます。

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