初めて投稿します。
業務で名簿を作ることになりました。Accessの知識はど素人に毛が生えた程度です。
テーブルの構造やリレーションなどで悩んでいます。
名簿は毎年度ごとに作成しますが、前年度と同じメンバーがほとんどのため、ネットで見つけたVBでレコードの複製というのをすれば楽と思いました。
テーブルの構造ですが
氏名テーブル
氏名ID
氏名
イベントテーブル(実際はフィールドは20くらいあります)
氏名ID
イベントID
イベント名
年度
連絡先テーブル(実際はフィールド50くらいあります)
イベントID
連絡先ID
連絡先名称
氏名IDとイベントIDにそれぞれリレーションシップを設定。
テーブルを3つに分けた理由は、イベントテーブルの情報の数か月後に連絡先テーブルの情報がくるためです。
年間の登録数は2000人くらいで随時これらの情報がきます。
また、同じ年度の違うイベントに重複して登録する人もいます。
イベントテーブルの情報が届いた時点で前年度のイベントテーブルの情報を複写し、連絡先テーブルの情報が届いたら前年度または同じ年度の別のイベントで登録されている連絡先情報を複写すればいいと考えやってみたところ、イベントテーブルのレコード複写はできましたが、連絡先テーブルのレコード複写をしようとすると「追加貼り付けは無効です」とのメッセージがでます。
多分フォームのレコードソースがクエリ(氏名テーブルとイベントテーブル)と連絡先テーブルのクエリのせいと思うのですが(その解釈であっていますでしょうか)このエラーの回避方法、または全く違う考え方でもいいのでいい方法があれば教えていただきたいです。
なおイベントテーブルと連絡先テーブルを分けずに1つのテーブルにできればいいのですが、名簿は色々な時期に色々な人が閲覧するため、例えば連絡先テーブルの情報がまだ届かない時に複写により連絡先テーブル情報が入力されてしまうと、連絡先情報に変更があるかもしれないのに前年の情報が閲覧されてしまいます。
また、業務の進捗上、イベントテーブルの情報を入れてから連絡先テーブルの情報をもらう仕組みのため、イベントテーブルの情報と連絡先テーブルの情報をまとめて入力することはできません。
わかりにくい説明でしたら申し訳ありませんが、よろしくお願いいたします。
通報 ...
正規化、関数従属性、One Fact in One Placeを学んで、主キーを設定しましょう。
ありがとうございます。
まだまだ分かっていないことだらけです。One Fact in One Place初めて聞く言葉です。
もう一度最初から勉強しなおします。
名簿テーブルを年度ごとに分けるという設計はデータベースとしてはNGです。
年度ごとのデータが必要なら、テーブルに入会日、退会日フィールドを追加しておけば、クエリで年度ごとに抽出することが可能です。
レコードを複製するという設計もNGです。重複するデータを複数個所に格納せずに、一つのテーブルに格納しておいて必要に応じて参照するという設計にします。
→One Fact in One Place
どのようにしたのか情報が不足しているので回答不能ですが、それ以前に既に指摘があるように、「正規化」ということに関して学習してからテーブルの設計を見直すことが先決でしょう。
「正規化」でWEB検索すると解説サイトが多数見つかりますので、そこで学習してください。
ありがとうございます。
まずは正規化について再度よく学んで理解してからですね。
複製については説明いただいていることはなんとなくわかったので、One Fact in One Placeが理解できたらやってみようと思います
「同じメンバーがほとんど」であるにもかかわらず、なぜ年度ごとに名簿を作成(レコードを複製)するのでしょうか。
あるイベントに参加登録をした人物が、別のイベントに参加登録した人物と同一であるかどうかをどのような手続きや方法によって特定/識別されているのでしょうか。
今回の場合は[氏名ID]が何らかの個人を識別するためのキーとなると思われますが、それはどのタイミングで登録、発行されるのでしょうか。
また、上記の 2 つ以外のフィールド(例えば[住所]や[電話番号]など)が設けられていないのは何故でしょうか。
上記が「個々のイベントに関する情報」を記録するためのテーブルであるならば、[氏名ID]は不要でしょう。
「それぞれのイベントへの参加を申し込んだ人々の情報」を記録するためのテーブルとは区別すべきです。
ここでの「連絡先」とは具体的に何と紐づいているのでしょうか。
「イベントテーブルの情報」と「連絡先テーブルの情報」はそれぞれ、どのような流れで、どのような形式で受け取るのでしょうか。
例えば、他のどなたかが作成したデータファイル( CSV ファイルや Excel ブックなど)が電子メールなどで送信されてくる、といったことでしょうか。
細かくありがとうございます。
ご指摘内容いただいたことを読んでずいぶんとずれたテーブル設計をしていることに気づきました。
2点ほど
・同一人物の確定方法
⇒最初の質問で省略してしまいましたが住所、電話番号、生年月日等で判断します。氏名テーブルとイベントテーブルの情報が同時にきて、その中にあります。
・「イベントテーブルの情報」と「連絡先テーブルの情報」の流れと形式
⇒ご推察の通り他の方が作成したエクセルデータでもらいます。
もう一度基本から勉強してきます。
生年月日が変わることはないにしても、住所、電話番号が変わる可能性は大いにありますので、変わると同一人物と特定できなくなるのは問題かと思われます。