1.はじめに
こんにちは!Webエンジニアになりたくて勉強を始めた初学者です。
本記事では、RDBの構築時に1つのフィールドに複数の値を入れたくなったとき、どういった方法があるかを初心者目線でかみ砕いて記載します。
2.配列を入れたらダメなの?
例えば、商品に対するジャンル分けのデータベースを考えてみましょう。このとき、1つの商品が複数のジャンルを持つケースは容易に想像できると思います。
例:ドライヤーに対して、「家電」、「美容」といったジャンルを付与する
このとき、「ジャンル」というカラムを作って複数の値(配列)を入れる方法が考えられます。
この方法で対応できる場合もあるかもしれませんが、基本的には推奨されない方法です。
- 第1正規形の定義を満たさない
- 実際的には、クエリを工夫すれば疑似的な配列として利用できる場合があるが、クエリが複雑になるため可読性や保守性が損なわれてしまう
商品 | ジャンル |
---|---|
ドライヤーA | 家電,美容 |
3.必要な分だけカラムを増やせばいい?
「ジャンルが2つあるのなら、カラムを2つ作ればいい」という考えもあるかもしれません。ジャンルの最大数が限られている場合はこの方法でもよいかもしれませんが、汎用性に課題があります。
- ジャンルの最大数を増やしたくなったら、その都度改修する必要がある
- ジャンルの最大数を増やすと、カラムが増える分だけクエリも長く複雑になってしまう
商品 | ジャンル1 | ジャンル2 |
---|---|---|
ドライヤーA | 家電 | 美容 |
4.個別にレコードを作って対応する
最後に、レコードを増やすことで対応する方法を記載します。この方法では、商品とジャンルの関係1つ1つについてレコードを作成します。ジャンルの最大数に関係なくカラムは1つで済みます。
- 正規形の定義を満たす形でテーブルを作成できる
- ジャンルの最大数を増やしても改修する必要はない
商品 | ジャンル |
---|---|
ドライヤーA | 家電 |
ドライヤーA | 美容 |
※同じ「商品」の別レコードを区別するためには、連番などのカラムを作っておいて複合主キーにすれば対応できる
記事は以上となります。
もし記事に誤りや、「こういう方法もある」などご意見がありましたら、コメントいただけますと幸いです。