データベース22年度 午後I 問2 設問2

このQ&Aのポイント
  • NULL不可を動的に管理する”項目チェック”テーブルの空欄埋め問題で、解答は以下の通りでした。
  • 項目チェックテーブルは、一連番号、会員列名称、会員区分、職業区分の4つの列で構成されています。
  • 一連番号は主キーであり、サロゲートキーとして使用されることが想定されています。
回答を見る
  • ベストアンサー

データベース22年度 午後I 問2 設問2

”会員”テーブルの項目は、NULL不可となることが静的に決まらないので、列ごとにNOT NULL制約を定義できない。そこでNULL不可であることを動的に管理する”項目チェック”テーブルを図のように定義した。・・・ というNULL不可を動的に管理する”項目チェック”テーブルの空欄埋め問題で、解答は以下の通りでした。 項目チェック(一連番号,会員列名称,会員区分,職業区分) 一連番号が主キー しかしながら一連番号がどうして必要なのか分かりません。 たとえ新たな職業区分を追加したとしても{会員列名称,会員区分,職業区分}を主キーにしておけばまかなえると思うのですが。 一連番号がサロゲートキーにしか思えないのですが、どなたか解説お願いいたします。

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

  • ベストアンサー
  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.1

表1を見ると、家族会員の場合は職業区分が不要(NULLあり)のため、職業区分を主キーに含めることはできないということでしょうね。 本来であれば、家族会員用の職業区分を自動設定する仕組みにして、会員列名称,会員区分,職業区分を主キーにするのが王道です。 が、それはアプリケーション側の話となるためDB設計としてみた場合は良くないということでしょう。

madarajin
質問者

お礼

主キーはNULL不可でしたね。 家族会員のケースをうっかりしていました。 ありがとうございました。

関連するQ&A

  • データベース:主キーが文字列の場合IDを振るべき?

    テーブルの主キーが文字列の場合、 その主キーの文字列を通し番号に置き換えて、 その文字列は別テーブルに移したほうが検索が速いですか? 例えば、テーブルが CREATE TABLE spec ( test_name VARCHAR(40) NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_name) ); で、40文字という長いテスト項目名の場合、 CREATE TABLE spec ( test_id INTEGER NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_id) ); と CREATE TABLE test ( test_id INTEGER NOT NULL, test_name VARCHAR(40) NOT NULL, PRIMARY KEY(test_id) ); という二つのテーブルに分けたほうが検索は速くなりますか? (もちろん、結合する時間も含めてです。) もし速くなるとしても、文字数が3文字など少ない場合は 通し番号に置き換えてもきっと効果は薄いですよね? 何文字以上の文字列なら通し番号に置き換えたほうが速いですか? 皆さんはどのように決めていますか?

  • ユニークインデックスについて

    仕事の関係で、テーブル定義の際にユニークインデックスをどの列の組み合わせにするのか考える必要があるのですが、今までユニークインデックスの存在自体知らず、困っています。 自分自身でネット等で調べた結果以下のことは理解できました。  1.ユニークインデックスで指定された列は値が一意でなければならない。  2.主キーの列にはNULL値は不可だが、ユニークインデックスの列はNULL値も可。  3.主キーは一つのテーブルにつき、一つしか設定できないが、    ユニークインデックスは複数設定できる。(同じ列は指定できない)  4.主キー設定時、実は暗黙的にユニークインデックスとNOT NULL制約が作成されている。 ここまでは分かったのですが、主キーとは別で、明示的にユニークインデックスを指定する必要性とはなんなのでしょうか? 主キーとは別で明示的に指定した方が良い場合と、その実例をどなたか教えて頂けないでしょうか? よろしくお願いします。

  • SWの平成15年・午後2の問題で

    設問3での答えが疑問です。 答えは以下の通りとなっていますよね? (主キーは【】でくくってあります) 会議室(【会議室番号】、会議室タイプ) 予約簿(【予約番号】、【使用時間帯区分コード】、利用者番号、会議室番号、使用予定日) 会議室料金表(【会議室タイプ】、【使用時間帯区分コード】、料金) 時間帯(【使用時間帯区分コード】、使用時間帯) 利用者台帳(【利用者番号】、氏名、住所、電話番号) このとき、『予約簿』における「使用時間帯区分コード」は主キーなのでしょうか? 『予約簿』においては図2に例がありますが、これをみても使用時間帯については他の予約とかぶる部分があり一意性が無いと言えますよね? つまり主キーにはなりえないと思うのですが・・。 主キーとは一意性があり、かつNULL値を許さないという条件がありますよね? 『予約簿』以外でも『時間帯』以外では一意性が無いと感じるのですが・・。 まだ、主キーがはっきり分かっていないだけなのかもしれませんが、なぜ「使用時間帯区分コード」は主キーではないのでしょうか?

  • データベーススペシャリスト午後II問題 問2

    平成23年春期データベーススペシャリスト午後II問題 問2設問番号なし(2)の問題について (設問数が1問のため設問番号はありません。) 概念データモデルを完成させる問題ですが、ひとつどうしても納得のいかない箇所があります。 「部門」と「生産現場」「倉庫」の関係と、「取引先」と「部材メーカ」の関係です。 解答では、「部門」がスーパータイプ、「生産現場」と「倉庫」がサブタイプで、 「取引先」がスーパータイプ、「部材メーカ」がサブタイプとなっています。 (画像の赤丸の部分です。) どう考えてもこの2つそれぞれの関係は、スーパータイプサブタイプではなく、外部キーでマスタを参照する1対1又は1対多の関係だと思うのですが・・。 各テーブル構造は以下です。 部門〔部門コード(主キー)、部門名、部門種類〕 生産現場〔生産現場拠点コード(主キー)、部門コード(外部キー)、現場区分〕 倉庫〔倉庫拠点コード(主キー)、部門コード(外部キー)、倉庫区分〕 取引先〔取引先コード(主キー)、取引先名、取引先種類〕 部材メーカ〔部材メーカ拠点コード(主キー)、取引先コード(外部キー)、物流費負担率〕 ※テーブル構造は問題と解答から引用しています。 問題文で関係する箇所を引用します。 --------------------------------------------------------------------- ・部門は、部門コードで一意に識別される。部門には、いくつかの種類がありその分類は、部門種類によって識別される。 ・取引先は、取引先コードで一意に識別される。取引先には、いくつかの種類があり、その分類は、取引先種類によって識別される。 ・在庫把握やものの移動の管理を必要とする場所を拠点と呼ぶ。 ・拠点は、Y社の一部の部門又は一部の取引先からなら在庫管理業務上の組織の呼称であり、拠点コードで一意に識別される。 ・ある拠点が、Y社の部門である場合は、Y社のどの部門に相当するかを識別するために、Y社の部門コードが与えられている。 ・拠点は、生産現場、倉庫、部材メーカの3つに大別され、拠点区分によって識別される。 --------------------------------------------------------------------- すみませんが誰かわかる方教えてください。 問題 http://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2011h23_1/2011h23tokubetsu_db_pm2_qs.pdf 解答 http://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2011h23_1/2011h23tokubetsu_db_pm2_ans.pdf

  • データベース:二つのテーブルの繋ぎ方

    私(あなた)が検査担当者だとします。 そして、測定担当者から CREATE TABLE measurement ( lot VARCHAR(10) NOT NULL, test_id INTEGER NOT NULL, data NUMERIC(17,7), PRIMARY KEY(lot, test_id) ); という、あるロットでのテスト番号に対する測定値データが送られてきたとします。 そして、設計担当者から CREATE TABLE spec ( test_name VARCHAR(10) NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_name) ); という、テスト項目名に対する上限・下限の仕様データが送られてきたとします。 ここで、テスト番号とテスト項目名は同じ数だけあって、お互いが一致するように同じ順番で並んでいるとします。 この二つのテーブルを使って、測定値が範囲内か範囲外かを調べるのが目的です。 この場合、どうやって二つのテーブルを繋ぐのが一般的ですか? 自分の考えだと、一旦、specテーブルにtest_idを加えて CREATE TABLE spec ( test_id INTEGER NOT NULL, test_name VARCHAR(10) NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_id, test_name) ); とするのですが、第二(第三?)正規化に基づいて CREATE TABLE spec ( test_id INTEGER NOT NULL, upper_limit NUMERIC(17,7), lower_limit NUMERIC(17,7), PRIMARY KEY(test_id) ); と CREATE TABLE test ( test_id INTEGER NOT NULL, test_name VARCHAR(10), PRIMARY KEY(test_id) ); の二つに分けるのかな、と思っています。 正規化の観点から言うと、きっとこれが正しいのかなと思っています。 でも、元々、specテーブルにはテスト項目名が入っていたのでテスト項目名と上限・下限が一目で分かっていたのに、このように分けると、いちいちspecテーブルでテスト番号を確認してから、testテーブルでそのテスト番号に該当するテスト項目名を見つけなくてはならなくなってしまいます。クエリーでの検索もJOINをしなければならなくなって遅くなりませんか? 敢えて正規化しないでおく、なんて手段もありますか? こんな場合、皆さんならどうしますか? 「こうするように決められている」なのか、 「ああもできるし、こうもできるんですが、どっちでもいいですよ」なのか、 温度差みたいなものもできれば知りたいです。

  • アクセスフォームで別テーブルの呼びだし。。。

    よろしくお願いします。 アクセスで区分と連番というテーブルがあります。 フォーム連番を使い入力していますがフォームから手入力するのが大変なので区分というテーブルをつくり、入力するときに区分テーブルから参照できるようにしたいのです、リレーションショップはしてみましたが考えているような参照はできませんでした。 フォーム連番は下記4項目入力しています。 管理区分: 連番: 機器番号: 機器名称: テーブル区分は下記の2項目です 管理区分: 機器名称: このときフォームの機器名称のところで区分の機器名称を参照してほしいのですが。 教えてください、お願いします。

  • 主キー以外の項目にNotNull制約をつける理由について

    あるプロジェクトで OracleにアクセスするJavaのプログラムを書いています。 使用しているテーブル定義は、 主キーでも何でもない項目ほぼ全てにNotNull制約が付いています。 別にNotNull制約を除けば主キー以外の制約は何もありません。 これからつく予定もありません。 そこでふと、 各項目の入力値は全てプログラム側でチェックしていますので プライマリキーや共通のフッタ部分(登録日、登録ProgramIDなど)を除けば Not Null制約は全くいらないんじゃないかと思いました。 このような場合、NotNull制約は何の為についているんでしょうか?

  • データベースの問題

     (テーブル名)     (フィールド名)   学生表       番号,氏名,電話番号,アドレス,コースコード,出身県コード   コース表     コースコード,コース名   出身県表      出身県コード,出身県名 *コースコードは2文字で、経営コース(BM)、会計コース(AC)、情報コース(IS)、国際コース(IB) *出身県コードは2文字とし、データ入力時に各自定義するものとします。 ●上記のようなテーブルからなるデータベースを作成したいのですが、 (1)各テーブルの基本キーを教えてください。また、外部キーがあれば、その項目名と、その外部キーによって関係付けられているテーブル名を教えてください。  (2)各項目に適するデータ型を決めて、このデータベースのデータ定義をどのようなSQL-DDLで記述すればよろしいのでしょうか? ●このデータベースを用いて、つぎの検索を行うためのSELECT文をSQL-DMLでの記述の仕方を教えてください。 (3) 学籍番号、氏名、電話番号からなる表Aを作る。 (4) コース名、学籍番号、氏名からなる表Bを作る。 (5) 学籍番号、氏名、メールアドレス、出身県名からなる表Cを作る。 (6) 自分と同じコースの人の氏名とメールアドレスからなる表Dを作る。 (7) 学籍番号、氏名、コース名、出身県名からなる表Eを作る。 ちなみに、自分の解答は下記のようになったのですが、間違っている部分があるかと思うのでご指摘おねがいします。 (1) (テーブル名) (主キー)   (外部キー)    (外部キーによって関連付けられるテーブル)    学生表       番号    コースコード   コース表(コースコード)                     出身県コード   出身県表(出身県コード)        コース表    コースコード    なし        出身県表    出身県コード    なし (2)<データ定義(SQL-DDL)>  CREATE SCHEMA  AUTHORIZATION HAMADA  CREATE TABLE 学生表 (番号      CHAR(10) NOT NULL PRIMARY KEY,  氏名      CHAR(20),  電話番号   CHAR(30),  アドレス    CHAR(30),  コースコード CHAR(2) NOT NULL REFERENCES コース表)  出身県コード CHAR(2) NOT NULL REFERENCES 出身県表)  CREATE TABLE コース表 (コースコード CHAR(2) NOT NULL PRIMARY KEY,  コース名   CHAR(20) NOT NULL )  CREATE TABLE 出身県表 (出身県コード CHAR(2) NOT NULL PRIMARY KEY,   出身県名   CHAR(20) NOT NULL ) (3) SELECT 番号, 氏名, 電話番号 FROM 学生表 INTO 表A (4) SELECT コース名, 番号, 氏名 FROM 学生表, コース表 INTO 表B WHERE 学生表, コースコード = コース表, コースコード (5) SELECT 番号, 氏名, アドレス, 出身県名 FROM 学生表, 出身県名 INTO 表C WHERE 学生表, 出身県コード = 出身県表, 出身県コード (6) SELECT 氏名, アドレス FROM 学生表, コース表 INTO 表D WHERE 学生表, コースコード = コース表, コースコード AND コース名 = "情報コース" (7) SELECT 番号, 氏名, コース名, 出身県名 FROM 学生表, 出身県名 INTO 表E WHERE 学生表, 出身県コード = 出身県表, 出身県コード AND 学生表, コースコード = コース表, コースコード

  • ALTER TABLE文の書き方について

    お世話になります。 今、以下のような列からなるテーブルがあります。 ・A(主キー) ・B(主キー) ・C(主キー) ・D(主キー) ・E(NOT NULL) ・F 列A、B、C、Dが複数列の組み合わせで主キーです。 このテーブルを以下のように変更したい場合、 どのようなALTER TABLE文を書けばできますでしょうか。 ※列A、B、C、Dの主キーはやめて、列A、B、C、D、G、H、Iの  複数列によるUNIQUE制約を設定。 ・A(UNIQUE&NOT NULL)← 主キーはやめる ・B(UNIQUE&NOT NULL)← 主キーはやめる ・C(UNIQUE&NOT NULL)← 主キーはやめる ・D(UNIQUE&NOT NULL)← 主キーはやめる ・E(NOT NULL) ・F ・G(UNIQUE)← 追加 ・H(UNIQUE)← 追加 ・I(UNIQUE)← 追加 やりたいことは、列G、H、Iを追加して、 A、B、C、D、G、H、IでUNIQUEにしたく、かつ、 追加したG、H、IはNULLを許容したいということです。 A、B、C、D、G、H、Iの複数列の組み合わせで主キーも 考えましたが、主キーにするとNULLが許容できないと いうことで、上記のようなレイアウトを考えました。 他に上手い方法があればご教授いただけると幸いです。 ちなみに列のデータ型はすべて可変長の文字列です。

  • MySQLで同じデータにフラグ付け出来ますか?

    データベースの初心者です。MySQLを使用してSQL文を試しましたが、うまくいきません。 わかりやすく教えていただけますか? 下のような2つのテーブルで、テーブル2の項目カラムに存在するデータが、 テーブル1の区分にあれば、一致する行(NOカラムの5~7)だけに、 フラグ”1”を付けたいのです。(区分カラムに、"*"で始まるデータは除きます) 区分に、データが全て埋まっていれば簡単に出来るのですが、 先頭行のみデータがあって、次の区分まで、Nullが入っています。 テーブル1 NO 区分 フラグ 1  aaaaa   null 2  null     null 3  null     null 4  null     null 5  bbbbb   null 6  null     null 7  *nozoku  null 8  ccccc null 9  null null テーブル2 NO 項目 1  bbbbb 2  eeeee よろしくお願いします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう