DBの設計方法についての悩み!果物持ちより集会の帳票を作成するには?

このQ&Aのポイント
  • Accessでシステムを開発中で、果物持ちより集会の帳票を作成する方法について悩んでいます。果物の種類や人の名前を縦横に配置して集会ごとの帳票を作りたいのですが、テーブル構造をどうするかがわかりません。助言をいただけると幸いです。
  • 集会ごとに参加者の名前や持ち寄る果物の種類と数を登録して、集会の帳票を作成したいのですが、DBの設計方法に悩んでいます。果物の種類が多く、集会ごとに持ち寄る果物が変わるため、どのようなテーブル構造を組むべきかがわかりません。アドバイスをいただけると助かります。
  • 現在、Accessを使用してシステムを開発している中で、果物持ちより集会の帳票を作成する方法について詰まっています。果物の種類と参加者名を縦横に配置して、集会ごとの帳票を作成したいのですが、テーブルの設計方法がイメージできません。どのように組めばいいのか、ヒントをいただけるとありがたいです。
回答を見る
  • ベストアンサー

DBの設計の方法が分かりません。

今、Accessでシステムを作っているのですが、DBの設計をどうしたらいいか考えあぐねている部分があります。 長々と要件定義の内容をここに書いてもご迷惑かと思いますので、例え話で代用させていただきます。 「果物持ちより集会」というのがあって、人が様々な果物を持ちよります。 集会ごとに、集まった人の名前、果物の種類、数を登録していきます。 それを、縦軸→果物の種類、横軸→人の名前で集会ごとに帳票を作るというものです。 しかも、果物の種類は膨大です。集会がある前には何を持ってくるかは決定されますが、集会ごとにその対象は変わっていきます。人は1つの集会につき、だいたい2~10人くらいに集まります。 こういう帳票を作ることは可能でしょうか? テーブル構造をどうすればいいのか、頭の中で組み立てることができません。 小さなヒントでもいいので、どうかよろしくお願いします。 ○帳票はこんな感じです。 帳票1:7/27 ○×集会     A子 B子 C子 りんご 3  4  5 なし  4  6  1 みかん 2  5  4 帳票2:6/27 △△集会     A子 D子 りんご 4  4 いちご 7  8 みかん 1  4 メロン 2  1

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

  • ベストアンサー
  • rucifer
  • ベストアンサー率46% (6/13)
回答No.3

勘違いしていました。 各集会ごとに参加者は色々な果物を持ち寄るということですね・・。申し訳ありません。 集会テーブル(集会ごとに1レコード)  集会番号  日付 参加者テーブル  集会番号 (集会テーブルを参照  会員番号 (会員テーブルを参照 持ち寄った果物テーブル  集会番号 (参加者テーブルを参照  会員番号 (参加者テーブルを参照  果物番号 (果物テーブルを参照  個数 果物テーブル  果物番号  果物名 会員テーブル  会員番号  会員名 持ち寄った果物テーブルは、集会番号と会員番号と 果物番号を複合キーとします。 下記は持ち寄った果物テーブルの例です。 集会番号、会員番号、果物番号、個数 1, 1, 1, 5 1, 1, 2, 3 1, 2, 1, 5 結合すると、 1, Aさん, りんご, 5 1, Aさん, みかん, 3 1, Bさん, りんご, 5 となります。 SELECT * FROM 持ち寄った果物 WHERE 集会番号 = 1 AND 会員番号 = 1 とするとその集会1に参加した会員1さんが 持ち寄った果物と個数が得られます。 INT2はINTEGER型という意味です。

miwa_skswk
質問者

お礼

アドバイスありがとうございます!読んでてかなりスッキリしてきました!! でも、ちょっと気になるのが、集会ごとに持ち寄る果物は決まっているので… 1, Aさん, りんご, 5 1, Aさん, みかん, 3 1, Bさん, りんご, 5 1, Bさん, みかん, 1 2, Aさん, いちご, 5 2, Aさん, みかん, 3 2, Cさん, いちご, 5 2, Cさん, みかん, 1 と集会ごとに果物の項目が同じものを繰り返してしまうのは、この仕様の性質上、仕方のないことですよね? 集会は月に300件!くらいあり、一回で集める果物は7,8種類、参加者は1つの集会につき、だいたい2~10人くらいになるので、このテーブルのレコードは乗掛けでかなりの勢いで増えていきそうです。 確かにこの要件だとこれしか方法はないとは思うのですが…こういう設計って特に珍しくはないのでしょうか?

その他の回答 (3)

  • rucifer
  • ベストアンサー率46% (6/13)
回答No.4

集会ごとに持ち寄る果物は決まっている。 個数も固定であるならば、下記の設計でよいと思います。 会員テーブル  会員番号  氏名 果物テーブル  果物番号  果物名  持ち寄る果物テーブル  会員番号(会員テーブルを参照  果物番号(果物テーブルを参照  PRIMARY KEY (会員番号, 果物番号) 複合キー  個数 集会テーブル  集会番号  開催日 参加者テーブル  集会番号(集会テーブルを参照  会員番号(会員テーブルを参照  PRIMARY KEY (集会番号,会員番号) 複合キー 会員と果物の間に持ち寄る果物を定義しています。 持ち寄る果物テーブルには Aさん, りんご、5個 Aさん, かき、3個 Bさん, りんご、2個 というデータが入ります。 あとから参加者を元に持ち寄る果物テーブルを 参照すれば、何を持ち寄ったか、がわかりますが、 持ち寄る果物を変更してしまうと、過去の集会の 整合性がとれなくなります、先ほどの設計では、 集会ごとに何を持ち寄ったかが分かるので、 持ち寄った果物を変更しても、過去分に影響は 与えません。

miwa_skswk
質問者

お礼

やはり、集会単位での 持ち寄った果物テーブル  集会番号 (参加者テーブルを参照  会員番号 (参加者テーブルを参照  果物番号 (果物テーブルを参照  個数 という情報は必要だと思います。 ----------------------------- 1, Aさん, りんご, 5 1, Aさん, みかん, 3 1, Bさん, りんご, 5 1, Bさん, みかん, 1 ----------------------------- というレコードをどうやって ----------------------------- 帳票1:7/27 ○×集会     Aさん Bさん りんご 5   5  みかん 3   1  ----------------------------- と帳票に出すのかよく分からないのですが…(表の結合?) アドバイスを元に取り合えずDBを作ってから試行錯誤してみようと思います。何度もありがとうございました。

  • rucifer
  • ベストアンサー率46% (6/13)
回答No.2

先ほど回答したものですが、若干間違っていました。 下記にDDLを掲載します。 CREATE TABLE 集会 ( 集会番号 SERIAL NOT NULL, 日付 DATE, PRIMARY KEY (集会番号) ); CREATE TABLE 会員 ( 会員番号 SERIAL NOT NULL, 会員名 VARCHAR(40), PRIMARY KEY (会員番号) ); CREATE TABLE 果物 ( 果物番号 SERIAL NOT NULL, 果物名 VARCHAR(40), PRIMARY KEY (果物番号) ); CREATE TABLE 参加者 ( 集会番号 INT2 NOT NULL, 会員番号 INT2, 果物番号 INT2, 個数 INT2, PRIMARY KEY (集会番号) ); ALTER TABLE 参加者 ADD FOREIGN KEY (集会番号) REFERENCES 集会 (集会番号); ALTER TABLE 参加者 ADD FOREIGN KEY (会員番号) REFERENCES 会員 (会員番号); ALTER TABLE 参加者 ADD FOREIGN KEY (果物番号) REFERENCES 果物 (果物番号);

miwa_skswk
質問者

お礼

再びありがとうございます。 DDLは勉強で習ったくらいで、実際に扱ったことがないので、よくは分からないのですが…。 「参加者」テーブルに 集会番号、会員番号、果物番号、個数 という構造を作っておいて、各項目を紐付けしていくっていうことでしょうか?「参加者」テーブルは果物の種類ごとに1レコードになるのでしょうか?(これもまた集会番号で主キーにはならないと思うのですが) 「INT2」がポイントになりそうですが、検索を掛けてもそれらしいものがヒットしませんでした。 考え方のヒント程度で構いませんので、文章でお話していただけるとありがたいです…。

  • rucifer
  • ベストアンサー率46% (6/13)
回答No.1

厳密にではありませんが、 下記のような構造でよいと思います。 帳票はこれらのテーブルから組み合わせて都合の 良いように作成できると思います。 果物テーブル  果物番号(主キー)  果物名 会員テーブル  会員番号(主キー)  会員名 集会テーブル  集会番号(主キー)  集会名  集会日  会員番号(外部キー)  果物番号(外部キー)  個数  

miwa_skswk
質問者

お礼

早速の返信、ありがとうございます。 「集会テーブル」の構造について質問なんですが、「会員番号」や「果物番号」は一つの集会に対して複数項目ありますので、このテーブル構造にしてしまうと、集会番号で主キーにできないように思うのですが…。 私が「外部キー」の意味を取り違えていますでしょうか? もしよろしければ、この部分を解説していただけないでしょうか?

関連するQ&A

  • エクセル 関数 範囲のタイトルを1つのセルに帰す

    こんなことをしたいのですが、関数でできますでしょうか?         りんご みかん ばなな   A子   2   1   0    りんご、みかん B子   0   0   1    ばなな、 C子   1   1   1    りんご、みかん、ばなな D子   0   0   0   E子   0   4   0    みかん ・ ・ X子 例のように、A子~X子までがそれぞれりんご、みかん、ばななを買ったとき、買ったものの名前だけを、それぞれの名前と同じ行で、1つのセルに表示したいのです。果物の種類は10個以下で、どんな順番に記入されてもかまいません。実際はX子以上にたくさんいます。 よろしくお願いします。

  • エクセルマクロ◇別シートで個人ごとに数値の集計

    EXCEL2003です。 以下のように、名前・個数・商品名(名前と商品名は重複あり)が列記されている EXCELのデータを、別シートで商品名の個数を個人ごとに集計したいと思っています。 ◇元データ◇ 名前 個数 商品 A子  2  りんご A子  1  りんご A子  3  みかん A子  2  みかん A子  1  メロン B子  1  みかん B子  1  みかん B子  2  メロン B子  4  キウイ ◇集計データ◇ 名前 りんご みかん メロン キウイ A子  3   5    1 B子      2    2   4 最初ピボットテーブルを使えばいいかと思っていたのですが、 これ以外にも元データから取得する値が出てくる予定のため、 できればマクロを組んで別シートに集計したいです。 よろしくお願いいたします。

  • エクセルの関数?項目の種類を自動で計算したい

    セルに、りんご、なし、みかん、、、、etc.沢山果物の名前が入っていたとします。その種類が全部でいくつあるか知りたいのです。 データの集計を使うとわかるとは思うのですが、その方法でなく、特定のセルにりんご、なし、みかんetc、、、全部で10種類とか出したいのです。 よろしくお願いします。

  • エクセルで同順位の値を表示する方法

    windowsXP Excel2003です sheet1に   A   B   C    D   E 1    10代  20代  30代  40代 …70代以上 2 1位 みかん なし  りんご もも 3 2位 りんご もも  もも  みかん 4 3位 なし  りんご みかん りんご 5 4位 もも  みかん なし  なし 上記のように年代ごとに30位まで表示させたいと 思っています。 元になるsheet2は    A   B   C  D   E        I       10代 20代 30代 40代 …70代以上 1 みかん 150  50  80  180        みかん 2 りんご 100  70  170  100        りんご 3 なし   50  200  30  20        なし 4 もも   50  130  170 250        もも 以上のように年代別の列が10代から70代以上まであり、 A列の果物の種類は500行ほどあります。 (すべて違うものです) =VLOOKUP(LARGE($B$9:$B$12,1),$B$9:$I$12,8,0) を使ってそれぞれ、1位、2位、3位…の果物の名前を 表示させたのですが、上記の式だと、下記のように 表示されてしまいます。    10代  20代  30代  40代 …70代以上 1位 みかん なし  りんご もも 2位 りんご もも  りんご みかん 3位 なし  りんご みかん りんご 4位 なし  みかん なし  なし この10代の3位と4位、30代の1位と2位のように同じ順位になるもので、 2番目にくる果物を正しく表示させたいのですが、どのような数式を 使ったらいいのか教えてください。 果物種類は500ほどあり、順位が同じになるものは5種類くらいに なることがあります。 10代から70代以上のこの表が3つあるので、関数でどうにかしたいと 思っています。 初めての質問なので分かりにくいところもあるかと思いますが、 よろしくお願いいたします。

  • Accessのクエリーで。

    テーブルA ID テーブルB ID 年 種類 テーブルC ID 年 種類 備考 テーブルCはBの詳細をかいたようなものになっていて、希望した時だけみられるようになっています(クリックする)。 これらのテーブルをもとにクエリーを作成しました。 テーブルA-B-Cの「ID」でリレーションがされています。 B-Cの「年」もリレーションされています。 たとえば、10というIDの人がいて、2001年と2002年のデータがあったとします。 ID | 年   | 種類 | 備考 10 | 2001 | みかん | 10 | 2002 | りんご | 青森産 10 | 2002 | みかん |愛媛産 10 | 2002 | めろん | というような感じだとします。 これがそれぞれABCに入っています。 クエリーのリレーションで「種類」にリレーションを貼らないと、 10 | 2002 | りんご | 青森産 10 | 2002 | りんご | 愛媛産 10 | 2002 | りんご | 10 | 2002 | みかん | 青森産 10 | 2002 | みかん | 愛媛産 10 | 2002 | みかん | 10 | 2002 | めろん | 青森産 10 | 2002 | めろん | 愛媛産 10 | 2002 | めろん | とダブッてしまい、「種類」でリレーションをはると 10 | 2002 | りんご | 青森産 10 | 2002 | みかん | 愛媛産 と、備考に何かが入ってるものしか出なくなってしまいます。 これを回避するにはどのようにしたらいいのでしょうか? よろしくお願いします。 AC2000です。

  • エクセル2010で 項目の抜き出しをしたい

    エクセル2010で 項目の抜き出しをしたいです。 たとえば、A列に りんご りんご バナナ トマト りんご バナナ みかん トマト メロン バナナ リンゴ みかん ぶどう とデータが入っているとき、これらのデータには、 トマト バナナ りんご リンゴ みかん メロン ぶどう という種類のデータが入っているということを簡単に表示する方法が知りたいです。 どうぞよろしくお願いします。

  • Excel2003グラフ - 集合縦棒を前後に並べる方法

    りんご、みかん、バナナの月別の販売実績を年度ごとに比較表示する表の作り方を教えてください。 グラフの種類として「集合縦棒」を使い、横軸に月、 縦軸に販売実績、系列としてりんご、みかん、バナナを指定し表を作ります。 これを1年分として、前年度との比較ができる棒グラフを作成したいのですが、方法がわかりません。 複合グラフを使用すればいいと思うのですが、 「集合縦棒」同士で複合グラフを作成する方法はありますか? そのほか、よい方法がありましたら教えてください。

  • モンチッチの地域限定携帯ストラップ

    モンチッチの携帯ストラップを集めているのですが・・・。 今の所、徳島のすだち、愛媛のみかんしか持っていません。 北海道のメロン 信州のりんご、ももはわかっているのですが、他に知ってるのがあったら是非教えて下さい!!出来れば果物系?例えばみかんならモンチッチの頭にみかんをかぶってるとか・・・。宜しくお願いします。

  • チェックボックス(複数選択可)の値をPOST送信し、

    果物テーブルの中身を入力フォームにて、チェックボックスにより選択 得られた果物コードをSELECT文により、果物名に変換して表示 保存時は好きな果物1、好きな果物2、好きな果物3、、カラムにコードを保存。 例)あなたの好きな果物は? りんご  みかん  いちご  メロン (チェックボックスにより選択) 果物テーブル: 1 りんご 2 みかん 3 いちご 4 メロン 入力フォームよりPOSTにて選択された果物のコードを送信 入力確認画面にて得られたコードより果物名に変換 選択されたコードを保存 上記のようなイメージです。 例えば、りんご、みかん、いちごを選択された場合、(1,2,3)が得られ、これを分解してSELECTする方法が分かりません。 すなわち配列の操作になるかと思われます。 (1,2,3)コードは取得出来ています。 以上、ご教授頂けたら助かります。

    • ベストアンサー
    • PHP
  • 果物と野菜

    果物と野菜の違いはなんですか? 私が今まで思っていたことは、簡単に言うと『木になる実が果物』そして『一年でか れるもの、つまり一年草の実が野菜』。 だから、スイカや、メロンは野菜でキウイや、リンゴ、ミカンはくだもの。当然トマ トは野菜。 どうなんでしょうか。 よろしくおねがいいたします。