• ベストアンサー

データベース設計

データベースを使ったサイトを勉強しています。 始めにデータベースを作ろうと思って早速壁に当たりました。 必要なデータは 「ID,フラグ1,フラグ2,名前,住所,TEL,登録日,年代,趣味,メモ」。 IDは一意な番号、 フラグ1,フラグ2はYes/No、 年代は10個程度の決められた文字の中から1個、 趣味は10種類程度の決められた文字の中から複数。 このようなデータが入ったデータベースを作りたい場合、どのような構造にするのが良いのでしょうか。 アドバイス頂けたらと思います。

  • MySQL
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • _chihiro_
  • ベストアンサー率63% (26/41)
回答No.2

/** * table1テーブル */ create table table1 ( id int unsigned auto_increment, flag1 bool default 0, flag2 bool default 0, name varchar(64) default '', address varchar(256) default '', telephone varchar(24) default '', age tinyint unsigned, --←ageテーブルのidが入る hobby tinyint unsigned, --←hobbyテーブルのidが入る memo text default '', regist_date date, primary key (id) ); /** * 年代テーブル */ create table age ( id int unsigned auto_increment, age varchar(32), primary key (id) ); /** * 趣味テーブル */ create table hobby ( id int unsigned auto_increment, hobby varchar(128), primary key (id) ); のように、年代と趣味テーブルの別で用意して、table1テーブルでは、ageテーブルと趣味テーブルのID(primary key)を入れるようにするかなぁ、、、。 年代と趣味カラムを文字で入れなければならないなら、varchar(xx)を使わないといけないですけど、、、。 カラムの型とかDEFAULT値とかNOTNULL制約とかはお好みですね。

LINLIN74
質問者

お礼

ありがとうございます。 詳しく書いていただいて、ありがたいです。 参考にさせていただき勉強していきたいと思います。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

IDはintのauto_incrementで フラグはsetで、名前、住所、電話はvarchar 登録日はdate、年代はENUMで 趣味はテーブルを分けて管理 メモはテキスト型かなぁ・・・ 量が多いなら、テーブルわけてもいいかも

LINLIN74
質問者

お礼

ありがとうございます。 table1 [ID(int),フラグ1(set),フラグ21(set),名前(varchar),住所(varchar),TEL(varchar),登録日(date),年代(NUM),趣味ID,メモ(text)] 趣味tbl [ID(int),趣味名(varchar)] という感じで良いのでしょうか? 趣味tblの[ID]にはtable1の[ID]が入るんですよね。 その場合、趣味が複数選ばれた場合、趣味tblは ID 趣味名 1 サッカー 1 野球 という風に選ばれた数だけ同IDが増えていく感じで良いのでしょうか?

関連するQ&A

  • データーベース設計段階での質問です。

    データーベース設計段階での質問です。 管理しなければならないフラグ項目が100近くあり、そのフラグがよく検索対象になります。ただし、1レコードにつけられるフラグは10個までと決まっています。現在使用中のデータベースでは10個のカラムをつくっていて、そこに対象フラグのIDを列挙しています。 例えば A項目に対して1,20,34,56,78 B項目に対して3,6,11,15,42,78,89 のフラグがたっている場合、 name f0  f1  f2  f3  f4  f5  f6  f7  f8  f9 ------------------------------------------------------ A   1   20  34  56  78  null null null null null B   3   6   11  15  42  78  89  null null null となっています。他に日付などのカラムが5項目ほどあります。 このままだと検索等でややこしいことになるため テーブルを整理したいと思っています。 1.100個のboolean型のカラムを作る 2.ビットフラグ(ビットフィールド)のカラムを4つほど作って、検索時ビット演算する 3.項目名(ID)とフラグNo、だけの2カラムで構成した別テーブルを作ってjoinする 4.文字列としてIDを格納し、フルテキストインデックスをはる などがあると思うのですが、効率のいい設計がいまいちよくわかっていません。 上記の方法以外にも何かいい方法があると思います。 このような場合の、テーブル設計の方法を教えて下さい。

  • データベースの設計をしています。

    データベースの設計をしています。 ユーザマスタというテーブルがあり、 その中には、個人または企業のデータが入ります。 マスタ登録時に個人と企業は微妙に必須項目が違います。 (例えば、企業の場合は代表者名が入る、など) 要件としては、「企業だけを検索したい」というものもあります。 ここで質問なのですが、 (1)ユーザマスタに「企業フラグ」をつけて、それが「1」のものと検索する (2)代表者名に値が入っているものを検索する この場合、(1)と(2)ではどちらが検索が速いのでしょうか。 (1)の方が、気分的に(なんとなく、です)速い気がするのですが、 (1)だと、余分にカラムを持つことになり、もし(1)も(2)も同じ速さOR(2)の方が速い場合には 無駄だなあ、と思って困っております。 どなたかお詳しい方がいらっしゃいましたら、 どうぞよろしくお願い致します。

    • ベストアンサー
    • MySQL
  • データベースの検索方法

    管理番号,ステータス,次の管理番号,表示フラグ 1,1,,1 2,2,1,0 3,2,3,0 4,1,,1 管理番号...auto_incrementにより、一意の値です ステータス…1.非公開,2.公開中 次の管理番号はこのデータの次のデータ管理番号が入っています 表示フラグは0または1が入ります ステータスが2で次の管理番号から管理番号をたどり、 その中で表示フラグ1のものだけを絞り込んで取得したいです。 mySqlの場合はどのように記述すれば、 よろしいでしょうか。

    • ベストアンサー
    • MySQL
  • Access フラグの自動上げ下げの仕方

    アクセス初心者です。 今、簡単なデータベースを作っているのですが、 テーブルのフィールドにIDが入力させたと同時に フラグのYes/Noのチェックを付けたり、 はずしたりするのは、どのようにしたら、よろしいのでしょうか? 物の貸出管理等で、 貸出たら、フラグをあげて、戻ってきたら、フラグを下げると いったイメージです。 よろしくお願い致します。

  • CGI(perl)データベースを教えてください。

    http://www2.inforyoma.or.jp/~tokaji/cgitech/db.htm を見てperlで簡易データベースを作ることが可能ということを知ったのですが、いくつか質問があります。 お願い致します。 <状況> flashから送られてきた「ID」・「パスワード」・「その他のデータ」をサーバのperlデータベースで管理する。 (1)まず、本当にperlでデータベースは作れるのでしょうか? (2)access等の簡易ではないデータベースと比べると どんなリスクがあるのでしょうか? (3)メモ帳でデータの管理をすると思うのですが、セキュリティ面は、大丈夫でしょうか? (4)どのくらい(仮に1000~10000人)のアクセスに耐えられるのでしょうか? サーバにかかる負荷は、access等の簡易ではないデータベースと比べると、大きくなるのでしょうか? (5)Flashからのデータをperlを使い管理する時、 最善の方法があれば教えてください。 長くなりましたが、よろしくお願い致します。

    • ベストアンサー
    • Perl
  • phpのデータベースへの接続

    1.PHPでフォームデータを受け取る 2.データベースに接続をして書き込み 3.書き込まれたIDを取り出す + 数値 + 乱数を一つの文字列に結合 4.上記の文字列をデータベースに保存。 このような動作は一つのphpで可能でしょうか? 2.までの動作は問題ないのですが、 3.からが動作しません。 どなたかご教授ください。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • データベースに"や'を保存できない

    phpで会員制サイトの制作を勉強しています。 データベースへはPDOで接続しています。 MySQLデータベースを使用しています。 自己紹介文のような長めの文章をデータベースのTEXT型カラムにUPDATEで保存したいです。 $stmt = $db->prepare("UPDATE member SET text=:text WHERE id=:id"); $stmt -> bindParam(':text ',$text,PDO::PARAM_STR); $stmt -> bindParam(':id',$id,PDO::PARAM_INT); $stmt -> execute(); というSQL文を作成し、 文字列データを保存することはできたのですが、 「"」や「'」のような記号を含めるとそれ以降の文章が消えた状態で保存されてしまいます。 例えば顔文字などで「"」や「'」のような記号を使用する場合もあると思うので、 できれば、データベースに保存したいです。 どうしたら安全に「"」や「'」が保存できるでしょうか? ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • データベースのフィールドのデータ型について

    くだらない質問で申し訳ありませんが宜しくお願いします。 下記のようなデータを格納するテーブルを構築しています。 ・ユーザーID ・名前 ・カタカナ ・パスワード ・年齢 ・郵便番号 ・住所1 ・住所2 ・住所3 ・電話番号 ・メールアドレス ・備考 ・削除フラグ ・登録者 ・登録日 ・更新者 ・更新日 上記の内容を下記のようなテーブルのフィールドのデータ型を考えました。 ・ユーザーIDのデータ型をVARCHAR(4) ・名前のデータ型をVARCHAR(32) ・カタカナのデータ型をVARCHAR(32) ・パスワードのデータ型をVARCHAR(255) ・年齢のデータ型をINTEGER ・郵便番号のデータ型をVARCHAR(8) ・住所1のデータ型をVARCHAR(255) ・住所2のデータ型をVARCHAR(255) ・住所3のデータ型をVARCHAR(255) ・電話番号のデータ型をVARCHAR(18) ・メールアドレスのデータ型をVARCHAR(255) ・備考のデータ型をTEXT ・削除フラグのデータ型をVARCHAR(1) ・登録者のデータ型をVARCHAR(4) ・登録日のデータ型をTIMESTAMP ・更新者のデータ型をVARCHAR(4) ・更新日のデータ型をTIMESTAMP そうしたら下記のような風にテーブルのフィールドのデータ型にしたら格納する文字列の桁エラーが起こらないからどうといわれました。 ・ユーザーIDのデータ型をVARCHAR(4) ・名前のデータ型をTEXT ・カタカナのデータ型をTEXT ・パスワードのデータ型をTEXT ・年齢のデータ型をTEXT ・郵便番号のデータ型をTEXT ・住所1のデータ型をTEXT ・住所2のデータ型をTEXT ・住所3のデータ型をTEXT ・電話番号のデータ型をTEXT ・メールアドレスのデータ型をTEXT ・備考のデータ型をTEXT ・削除フラグのデータ型をVARCHAR(1) ・登録者のデータ型をVARCHAR(4) ・登録日のデータ型をTIMESTAMP ・更新者のデータ型をVARCHAR(4) ・更新日のデータ型をTIMESTAMP ※現在、使用しているデータベースはPostgreSQLですが、Microsoft SQL ServerやOracleやMySQL等の他のデータベースでもいいものなのかもご教授いただけると助かります。 私の知識不足でどちらがいいのかがわからず投稿させてもらいました。 申し訳ありませんが皆さんのお知恵をお貸し下さい。 宜しくお願いします。

  • 住所録データベースの設計

    EXCELで住所録を作ってましたが、ACCESSに切り替えよう と思っている者です。 今、住所録データベースの設計をしているのですが、 1) 個人で複数の住所を持っている人間が多い(実家・現住所など) 2) 結婚などにより、2人が1つの住所に住んでいる場合がある。 ので、「個人」テーブルと、「住居」テーブルを、2つ別々に作り、多対多で結ぼうと思ってます。 e-mail、携帯電話、年賀状履歴の情報も扱いたいと思ってます(それぞれにテーブルをおくつもりです)。 e-mailや履歴を、「個人」または「住居」どちらかに関連づけたいのですが、年賀状は個人に送る場合もあるし、家族に送る場合もあります。メールアドレスも、個人所有がほとんどですが、なかには家族所有なんかもあり。 個人と、住居の両方に、メールや履歴データを関連づける方法はないでしょうか? 例えば履歴テーブルに住居IDと個人IDの2つのフィールドをおいて、レコード毎に好きな方を入力しても設計として問題ないのでしょうか? よろしくお願いします。

  • 長い文章のデータベース格納について

    phpで会員制サイトの制作を勉強しています。 データベースへはPDOで接続しています。 MySQLデータベースを使用しています。 会員制サイトによくある、 各ユーザーの自己紹介文を保存したいのです。 500文字程度の文章になると思うのですが、 そういった長い文字列データはデータベースに保存してよいのでしょうか? 長い文字列はあまりデータベースには保存すべきでないでしょうか? また、データベースに保存すべきでない場合は どのように長い文字列を保存したら良いでしょうか? ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP