• 締切済み

DBが複雑すぎる

下記画像の社員出身マスタのようなDBがあるとします。 会社だとこれが非常に複雑になり、さらに専門家に結合してもらわないと誰も分かりません。大変な労力です。これが大型DBになると数百のコードマスタとなり、コードマスタとマスタの突合せはともあれ、コードマスタ同士の突合せもあり、重複や入力ミスや勘違いが多発しています。 「山田,青森,青森」と言った感じでは駄目でしょうか。 どうせプログラムで入力チェックしていますし、ラジオボタンで選択する等、入力ミスが起こるはずがありません。いざとなればそこにパキスタンと手入力しても問題なさそうですし、大掛かりなシステム改編作業が減ると思いますが。 何のためにどこの会社もこういう複雑な設計になっているのでしょうか。

noname#189001
noname#189001

みんなの回答

回答No.9

なんか、質問内容と回答に対する補足を見ていると... 設計側の物を、使用者側に、そのまま見せてる感じ? たとえば 「設計側」 コードマスター(ID,名称) 1,'北海道' ..... 20,'東京' ..... 47,'沖縄' 社員出身マスタ(社員コード,社員名,出身コード,方言) 1,'あ',1,1 1,'い',2,2 となっているとすると 「使用者側」 社員名を入力 or 選択(同姓同名がいる場合があるため、社員コード入力等が望ましい) 出身を選択(北海道, 東京, 沖縄 等から選択) 方言を選択(北海道, 東京, 沖縄 等から選択) 多くのシステムでは、こうなっています。 ですので、使用者側がコード入力する箇所は、社員コードぐらいですね。 ただし、昔から(汎用機)のシステムを使っていて、ずっと同じように使いたいという 会社もあります。 そのような場合、コード入力の方が、選択 or 漢字入力よりも慣れているため あえて、コード入力を使用者側がするということもあります。

回答No.8

一般的なシステムでは質問者様のおっしゃる通りの編集をするはずです。 参照先テーブルが存在する項目は参照先テーブルの一覧から選択する形で入力を求めます。 利用者側でデータベース構造を意識することは無いと思います。(マスタを編集する場合を除きます) 仮に「山田,1,1」と言った入力を求めるシステムであるならばDBではなくもっと上層のシステムの見直しを検討すべきです。 ではリストにない(マスタテーブルに無い)データを入力したい場合はどうするの?と聞かれそうですが、それも上層の仕事です。 「リストに存在しない」と言った内容の項目を選択できるようにしておき、それが選択されたら別途入力してもらいます。 一度入力されればマスタに登録されますので以降はリストに追加されているわけです。 ではその上層のシステムを作成するときにDBが簡単な方がいいのでは?と言った疑問にお答えします。 理由は単純で各項目は別のテーブルでも利用するからです。 たとえば社員名は社員名簿でも部署名簿でも給与明細でも利用します。 だから別に社員マスタで管理し、都度参照します。 もう一つ、編集労力が減ります。 山田花子さんが結婚し、鈴木花子さんになりました。 上記の例では社員名簿、部署名簿、給与明細の3カ所で編集する必要がありますが、複雑なDB設計であれば1カ所、社員マスタの編集で済みます。 制作側としてはデータを別管理しているにも関わらず同期させろと言われる方がDB構造を複雑化するよりも頭の痛い話です。

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.7

もしかしてマスタの内容をそのまま編集してる状態なんじゃないですか?ふつうは編集用のプログラムを用意して入力としては「青森」「青森」とかでプログラム内でコードに変換するものだと思うんですが。

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.6

う~ん、画像のマスタだけで話をすると別に複雑とは思いませんが。 「コードマスタ1」、「コードマスタ2」という名称は、わりにくくする元なので、 素直に「出身マスタ」「方言マスタ」としたほうがいいとは思いますが。 まず、出身と方言は同じではない。 例えば、出身が大阪でも、方言は、少なくとも河内弁と泉州弁の2種類はあります。 (他にもありますけどね。また、いわゆる関西弁なるものもありますし。) また、出身が福岡でも、親が秋田出身だったために、秋田弁をしゃべる人がいるかもしれません。 したがって別のマスタとせざる得ない。 >「山田,青森,青森」といった風にマスタを使わないと については、「パキスタン」を例にすると、 「パキスタン」と入れる人もいれば「パキスタン共和国」と入れる人もいる、 「バキスタン」と間違えていれるもいるかもしれません (この間違い探しは一目見てわからないから大変です。) また、この例ではいいのですが、例えば、人事マスタなので所属部署名を入れるとします。 「山田,青森,青森,販売第一課」 と持ったとします。 販売第一課が1月4日付けでシステム販売第一課と変わったら ・・・対象の全員を修正する必要があります。 マスタにしていたら、販売第一課の1レコードをシステム販売第一課にするだけで済みます。 (但し、同じ部署名でもマスタに持ってはいけない場合もあります。例えば、契約管理。  5年契約の契約情報を登録するときに、担当者山田さん。課はマスタから参照。としてしまうと、  5年後に、山田さんは人事部に所属しているので、この契約の営業担当部署は人事部ですという  ふざけたことになります。) といった感じで、マスタに持つことの長所、短所のイメージはつかめてもらえましたでしょうか。

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.5

 この写真のコードマスターなら、明らかに何らかの無駄があると推測します。    ただ、DBが大型になり、管理する物が複雑になると、マスターテーブル群が多くなり複雑になるのは致し方のないことです。  でも、このマスターテーブル群の存在は、普通は、ユーザーは知らなくても良い又は、見えないように作るのが普通なんですけどねぇ。  プログラムで入力チェックして、入力はラジオボタンでなんて表現が出るように、マスター表を人間の目で参照して、そのコードを入力するなんてユーザーインターフェースは今時無いんじゃないでしょうか。(昔には、こんなユーザーインターフェースもありました。入力用のオフコン(それって何?と思う人も多いでしょうね(笑))の横には、マスターテーブルのコード表を印刷した分厚い紙のファイルがあって、何か入力する時には、そのファイルを一生懸命めくってコードを探して打つんです。古参の方は亜ある程度のコードを覚えていて、コードを探すのも早いですから入力が早いんですよ。そんな時代もありました。)  今では、「えくせるってなんですか~?」なんて言う人には、マスターテーブル群の存在どころか、データベースの存在さえ見えないし、見えなくってたって業務の遂行が出来るというのが、正しいユーザーインターフェースのあり方です。  マスターテーブル群の本当の意味は、プログラマーの側にあります。データのチェックと整合性の保証を、自分が作るプログラムで作り込まずに、データベースの基本機能で保証させるために・・・何らかの変更がある時にも、少しでも手間をかけずに変更が出来るように・・・そのために、データベースを使用し、テーブルを正規化し、コードテーブル群を作ります。  この設計に上手下手は、明らかに存在します。下手な人が作ると、変更にも保守にも恐ろしく手間がかかるようになり・・・その結果、変更作業などのコストが跳ね上がることになります。  ユーザーの直接的な利便には何の関係もない世界です。(間接的には、利益があります。変更作業を発注した時の見積書のお値段が下がり、納期が短くなりますから(笑))

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.4

極端かもしれませんが、「東京」と入力する人と「東京都」と入力する人がいると困るのです。 というか、そういうところで入力する際にユーザーに判断を必要とするようなシステムは普通作りません。 ユーザーにコードを覚えさせて入力させるか、DBでコード管理するかは別問題です。 商品の受発注なんかでも今はバーコードなんかで発注できるようにして、ユーザーにコードを意識させませんよね。

回答No.3

>設計側ではなく、使う側なので、シンプルがいいんです。さらにDBって何、エクセルできないバイトパートもいますので、お願いします。 DB設計と画面設計は別の話ですね わからないなら、DBなんか使用せずexcelで単純な表でも作って必要な項目だけ入力すればよいかと思いますけど >何のためにどこの会社もこういう複雑な設計になっているのでしょうか。 実現したい機能が複雑だからです 複雑な機能が不要な人には意味が分からないでしょう。 貴方は貴方に必要な機能だけチョイスしてください

回答No.2

「山田,青森,青森」と言った感じでは駄目でしょうか。 それぞれをコードにした場合に比べ、データ量が増えるため、やりません。 (DB設計の基本ですね) で、画像で示された物ですと、 コードマスター1と2は統一できるし、id, code も統一できる。 無駄な物が多いから、管理が煩雑になる。 ちゃんと設計されたDBならば、くだらない改編作業なんて必要無い。 (No.1さんが書かれている基礎がしっかりできているかってのが鍵ですね)

noname#189001
質問者

補足

ありがとうございます。 >コードマスター1と2は統一できるし、id, code も統一できる。 idも連番のものが多く、何の意味があるのでしょうか。codeも要不要、未済、可否などのしょうもない物が多く、意味があるのでしょうか。 設計側ではなく、使う側なので、シンプルがいいんです。さらにDBって何、エクセルできないバイトパートもいますので、お願いします。

回答No.1
noname#189001
質問者

補足

ありがとうございます。正規化ではなくコードマスタの問題なんです。

関連するQ&A

  • データベースのフラグについて

    会社でよく見ることがあるDBのデータの格納形式ですが、ファイルサイズを節約しようとするのか、画像通りコードで格納されています。 大したことをしてませんが、ぱっとみ分かりづらいですし、しょうもないことでSEの人に結合してもらわないと誰も分かりません。 でさらに「鈴木朝食4」「山田夕食唐揚定食」みたいなイレギュラーなケースがあると、マスタ不備、コードブック再構築などの業務が発生して社内がごちゃごちゃです。 でさらにさらに簡単な入力画面になると、メインテーブル・サブテーブル・内部コード・マスタメンテなど莫大な業務が発生します。 よその会社でもこんなデータの持ち方をしますか?もっと効率的な方法はありませんか? ほんとにバイトでもできる、大したことしてませんので、くだらないことで毎日苦労するのはほんとに不愉快です。お願いします。

  • 異なるデータベース間のテーブル結合

    DB名:db1 TABLE名:得意先マスタ DB名:db2 TABLE名:ユーザマスタ 以上のように、異なるデータベースに存在する2つのテーブルをLEFT JOINさせたいです。 結合条件は ユーザマスタ.得意先コード = 得意先マスタ.得意先コード とします。 この場合の結合方法を教えてください。 以下のようなSQL文を書いても駄目でした。 SELECT * FROM db1.ADMINISTRATOR.得意先マスタ AS  得意先マスタ   LEFT OUTER JOIN db2.ADMINISTRATOR.ユーザマスタ AS ユーザマスタ ON ユーザマスタ.得意先コード = 得意先マスタ.得意先コード よろしくお願いいたします。

  • 複雑すぎる給与計算

    給与計算担当ですが、ここ何年かで 細々とした手当が増えて、チェック処理が複雑になり、 現場、総務1人目、総務2人目と 3重のチェック体制でやっていますが それでも毎回かなりのチェック漏れが出てしまっています。 現場の人に配慮した結果ですが、 困ったものです。 どうにかならないものでしょうか。 給与大臣を使い、アクセスで外付けした システムを使っています。 システム云々の前にタイムカードからの入力ミス 等人的ミスが多いです。 チェックのマニュアルもちゃんとしたものはなく、 何年も前の通達を遡ってみないと計算できなかったり するものもあります。 チェックして、ミスをみつけて、 見つけた方がミスしたものを責めて、 気まずい感じで、 こんなことばかりに労力を割いていて もっと他に改善すべきところがあったり するんじゃないのかなぁと思ったりします。

  • テーブルの結合の仕方 MSAccess97→MSSQLServer2000Dev

    初心者なので初歩的な質問かもしれませんがどうぞよろしくお願いします。 現在MSAccess97(Win2K)のDBをVB6sp4(Win2K)で操作しておりますが、 MSAccess97のDBをMSSQLServer2000に移行しようと考えておりましてクエリー(VBで作成したクライアント内のSQL文)での記述のしかたについて質問したいのですが、下記のように○売上明細テーブルと○商品マスタが存在していて いままで(Access)は SELECT 売上明細.*,商品マスタ.* FROM 売上明細 LEFT JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード; で結合して追加・削除・更新などしておりました。 商品マスタの内容は変更・削除しないで売上明細のほうは削除できました。 移行(MSSQLServer)しようとSQL文を書き直し SELECT 売上明細.*,商品マスタ.* FROM 売上明細 LEFT OUTER JOIN 商品マスタ ON 売上明細.商品コード = 商品マスタ.商品コード; として(SQLServerのDBを)削除すると商品マスタのほうまで削除されてしまいます。SQLServerのViewで直接削除してみても同じでした。 +-----+-------+--+----+-------+ |商品コード| 商品名   |単価| 数量 |  金 額  | +-----+-------+--+----+-------+ |00001 |        |50 |  20 |  1,000 |          ↑                              ここに設定する項目が売上明細にないので         商品マスタから参照したい(参照のみで更新・削除はしない)   SQLServerで商品マスタを変更・削除せずに商品明細のレコードを削除できる結合方法はないでしょうか?どなたかよろしくお願いいたします。

  • レコードの一致方法

    テーブルA(マスター) [コード]、[商品名]        ○○○、△△△ テーブルB [コード]、[商品名]       ○○○、△△△ テーブルC [コード]、[商品名]       ×××、△△△ 以上のように、3つのテーブルの不一致クエリーなどを 抽出する場合、テーブルAとB同士の場合は、一致しないのはコードを結合線で結べば、すぐに出てきますが、テーブルAとCの比較の場合は、コードを結合線で結んだところで、違うのでうまくできません。 商品名は△△△なので、コードが違っていても、商品名はあっているので、不一致ではなく、一致しているというように考えたいのです。 △△△についてのコードは×××、○○○というように2つ以上持っているような感じですれば、うまくいくとおもっているのですが、こういう場合はテーブルAにコードのフィールドを2つ作っておいて、結合線でつなぐときに切り替えてするしかないのでしょうか? テーブルA(マスター)で、このような、2つのコードを持っているとおもわれる商品はレコード100以上あって、それをそれぞれ選びながら入力していかないかとおもうと、大変な作業化とおもっているのですが、アドバイスあればお願いします。

  • レコード更新について

    レコード更新について 環境:ACCESS2000 状況:メインフォーム(マスター登録ボタン付)    サブフォーム(マスターテーブルをドラッグして貼り付けたもの)    マスターテーブル(品番 / レンタル日 / 返却日 / 貸出状況) やりたい事:サブフォームに表示してあるデータに       返却日をサブフォーム上で入力し(件数は不定)、そして       返却日が入力されたものの貸出状況を"返却済"と変更登録したい。 現状:コマンドボタンのイベントに Private Sub マスター登録ボタン_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("マスターテーブル", dbOpenDynaset) If rs!返却日 <> "" Then rs.Edit rs!貸出状況 = "返却済" rs.Update End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub しかし、上記コードでは返却日はマスターテーブルに反映しているのですが 貸出状況が変わってなく、どのようにしたら良いかわからないため ご質問させて頂きました。 まだまだACCESS勉強中で未熟なため、検討違いなコードになっているかもしれませんが コードの修正・改善、または全く違う方法等ご教授願えればと思います。        

  • アクセス2010の操作について

    こんばんは! アクセス2010を勉強しておりますが、さまざまの本を読んでもインターネットで検索しても、なかなか基本を理解できず又周囲にも質問できる人がいなく困っております。 以下の内容について数点の質問をさせて頂きますのでご指導をお願いいたします。 作成内容。 社員の成果を入力できるフォームを作成したく、保存したいデータは社員名、社員コード、成果です。社員名は、コンボボックスから選択を行いたい。(できれば社員名を表示すると、自動的に社員コードも表示したいのですが)以下の方法で作成したのですが、うまくできません(質問項目は下段です) ~作成の流れ~ 〇テーブルを作成・・・以下の2つのテーブルを作成し社員データを予め入力。 ・社員マスタ・・・・・・(フィールドは2つ)  「社員名」(テキスト型)  「社員コード」(テキスト型) ※主キー ・入力テーブル・・・・(フィールドは3つ)  「ID」(オートナンバー型)  「社員コード」(テキスト型)  「成果」(テキスト型) ※主キー 〇「社員マスタ」「入力テーブル」の2つのテーブルからクエリを作成。  ・社員コード同士を結合線で結ぶ(自動的に結ばれます)    (フィールド)  ID            社員名     社員コード   成果  (テーブル)   入力テーブル   社員マスタ  社員マスタ   入力テーブル 〇作成したクエリを基にフォームを作成  社員名をコンボボックスから選択できるように変更(値集合ソース→社員マスタ)  社員名をコンボボックスから選択し、社員コードを入力。成果を入力しようとすると。  入力できません。 (質問です)  (1)成果を入力するためにキーボードを押すと、文字が出ずにエラーメッセージ「レコードを追加でき ません。テーブル"入力テーブル"の結合キーがレコードセットにありません」と表示されますがなぜ でしょうか?  (2)、(1)でエラーメッセージが出ても保存を押すと、新規入力画面のコンボボックスに先ほどの入力 内容が追加されてしまうがなぜでしょうか?  (3)クエリとリレーションシップの使い分けの判断は?(今回はクエリから結合線で結びましたが、リレ ーションシップでも似たような事ができます)  (4)入力テーブルのフィールドは上記の3つでよろしいのでしょうか?  (5)このようなものを作成する時の手順を教えて頂けると非常に助かります。 よろしくお願いいたします。  

  • Access2002 マスタテーブル変更時の影響範囲の調べ方

    いつもお世話になっています。 2つのAccessデータベースを統合しようとしています。 両方に テーブル:「会社マスタ」 フィールド: ・会社コード ・会社名称 というテーブルがあり、ほぼ同じ内容なのですが、若干コードが異なる運用をしていたため、どちらかに統一すると、弊害が出ることが予測されます。 そこでお聞きしたいのですが、マスタテーブルの名称を変更する(実際は、どちらか一方に合わせるため、他方を削除する)場合、影響範囲を簡単に調査する方法はないでしょうか? (削除するほうのますたテーブルを参照しているフォームやクエリを洗い出したいのです) 別の人間が作ったDBですので、なかなか解析が難しく・・・。 どうぞよろしくお願いします。

  • ページ遷移せずにjava部品を実行したい。

    strutsのフレームワークを使い、プログラムを作り始めていますが。 strutsのページ遷移しなんとかデータのやり取りは出来るようになりました。 今回、画面から商品グループを入力し、その後、商品コードリストを プルダウンするとDBの商品マスタにアクセスしにいき、 入力された商品グループに対応する商品コードがプルダウンされるようにしたいと思っています。 こういうようにページ遷移しないでjavaの部品を起動する場合、 普通にJSPの<%= %>等を利用して、書くものなのでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Java
  • Access 意図しないパラメータ入力

    クエリを作成中なのですが、意図しないパラメータ入力ボックスが表示されます。 テーブルでは店マスタを一側 それ以外の項目が多側になっています。 エクセル用に横並びにするため多側を抽出条件で各項目ごとにクエリを作成しました。 これを一まとめのクエリにしようとしましたが項目が10以上あり クエリが複雑すぎる、ということで二つに分けようとしたのですが 二つ目のクエリでなぜかパラメータ入力が表示されます。 抽出条件は指定していません。 なぜこのようなことになるのでしょうか? 店マスタはテーブルのものを使用。 ゴルフ、球技ボール・・・は多テーブルから各条件を指定し抽出したクエリ。 SELECT ■店マスタ.店コード, ゴルフ.*, 球技ボール.*, 釣.*, 登山・アウトドア.*, 海・水中.*, 武道.*, その他.*, 合計.* FROM (((((((■店マスタ INNER JOIN ゴルフ ON ■店マスタ.店コード = ゴルフ.店コード) INNER JOIN 球技ボール ON ■店マスタ.店コード = 球技ボール.店コード) INNER JOIN 釣 ON ■店マスタ.店コード = 釣.店コード) INNER JOIN 登山・アウトドア ON ■店マスタ.店コード = 登山・アウトドア.店コード) INNER JOIN 海・水中 ON ■店マスタ.店コード = 海・水中.店コード) INNER JOIN 武道 ON ■店マスタ.店コード = 武道.店コード) INNER JOIN その他 ON ■店マスタ.店コード = その他.店コード) INNER JOIN 合計 ON ■店マスタ.店コード = 合計.店コード;