質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

MySQL: 複数の年齢層を格納するためのテーブル設計の相談

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 450
退会済みユーザー

退会済みユーザー

前提・実現したいこと

データベース初心者です。

キャンペーンと、そのキャンペーンに参加したいユーザーのマッチングサイトのようなものを作っています。

Webからは以下の操作が可能です。

  • キャンペーンには、キャンペーンに参加できるユーザーの年齢層を設定できる

  • 年齢層は、以下のような10歳刻みで複数選択できる
    "10~19", "20~29", "30~39", "40~49", "50~59", "60~" 

このとき、MySQLでどうテーブル設計するべきか、アドバイスいただけると助かります。

最初に考えた案

MySQLのSET型で、上記の年齢層をそのまま定義すれば良いかと考えました。

create table campaigns (
  id int primary key auto_increment,
  name varchar(20),
  age_range set("10~19", "20~29", "30~39", "40~49", "50~59", "60~")
);

しかしこれだと、あるユーザーの年齢からそのキャンペーンに参加できるかの判定するのが難しいと感じました。

2番目に考えた案

以下のような年齢の下限・上限が格納されたマスタを作ることを考えました。

 id age_from age_to
  1       10     19
  2       20     29
  3       30     39
  4       40     49

これであれば、ユーザーの年齢が対象かどうか判定しやすくなります。

しかし、以下の点が気になり、これがベストなのか不安になりました。

  • age_from, age_to に任意の数字が入ってしまう

  • 年齢層の定義が変わる可能性は低いが、ここまで柔軟にしなくてもよいのではないか。

  • そもそもこの程度のことでマスタを作るべきなのかどうか

このようなケースの場合、

  • どちらが良いのか
  • どのように格納するのがよくあるパターンなのか
  • 他に適切な方法があるか

など、教えていただけると幸いです。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

キャンペーンテーブルには id, name だけを持ち、
対象年齢テーブルに campaign_id, age_from, age_to を持つ。
てのはどうスかね。

無理してキャンペーンテーブルに複数の対象年齢を持つより
使いやすいような気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/14 19:55

    マスターテーブルを作るのではなく、アプリケーション側で保持するということですね。
    確かにその方が使いやすそうです。

    ありがとうございました!

    キャンセル

0

テーブルに生年月日を持てば 年齢を取得 できます。そこから対象になる年代を抜き出しては?

テーブルに生年月日ではなく年齢を持っていると誕生日が来るとテーブルを変更しなければならず、無駄な保守費用がかかります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/13 23:20

    回答ありがとうございます!
    すみません、質問文がわかりにくかったですね。
    ユーザーについてはおっしゃる通り誕生日を持っているので、年齢を求めることができます。

    私が相談したいことは、キャンペーンに対してどのように対象年齢層を設定すればよいのか、です。
    よろしくお願いします。

    キャンセル

  • 2019/11/13 23:44

    年齢から何十代かわかりますよね?
    お酒関係なら二十歳以上ならいくつでもよろしいこともわかりますよね?

    どんなキャンペーンをするのかわからないとアドバイスできないことも理解できますよね?

    マッチングサイトへの案内を送りたいなら、普通は二十歳以上で未婚であるという情報や、会う都合上ある程度の住んでいる場所の情報、LGBTに配慮した上で性別情報も必要、といった用途も詰める必要があります。

    キャンセル

0

年齢層は、以下のような10歳刻みで複数選択できる
"10~19", "20~29", "30~39", "40~49", "50~59", "60~" 

これが10代~60代と同義として扱えるなら(というかそうしたいように見えますが)
処理時に読み替えれば(between 10 and 19 のように)良いだけの話でマスタにする必要は無いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/14 19:59

    ありがとうございます。
    ユーザーのageに対して `between 10 and 19` はできるのですが、
    キャンペーンに対してどのように対象年齢層を紐付けるべきかが悩みどころでした。

    > マスタにする必要はない
    おっしゃる通りで、マスタのテーブルを作るのではなく、アプリケーション側で管理することにしました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る