• ベストアンサー
  • 暇なときにでも

DBのテーブルって

RDBを設計する際にまずテーブルをいくつか作成して、それらどうしをリレーションしていきますよね。このテーブルをいくつか作成する意味がよくわかっていません。この項目は必ず一つのテーブルで持っておいた方が言いと言いきれる、なにか定義みたいなものはないのでしょうか?DBの知っている人に聞くと経験でわかると言われます。経験のない者はどうしたらいいのでしょう?

共感・応援の気持ちを伝えよう!

  • 回答数7
  • 閲覧数418
  • ありがとう数16

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

  • ベストアンサー
  • 回答No.5
  • katuya
  • ベストアンサー率33% (38/115)

正規化自体の手法はきちんと確立されておりますので、誰が正規化しても元が同じなら正規化後も同じ結果になります。 「経験」が必要なのは、正規化の先「逆正規化」です。 第三正規形がデータ格納の観点から見てもっとも効率的で矛盾も生まれにくいのですが、これが必ずしもユーザ用件(レスポンスタイムなど)を満たすものではありません。 経験が必要といっても逆正規化の手法も確立されております。 書籍やRDB専門のサイトなどを参考になさってください。 正規化の手順ぐらいはすぐに見つかると思います。 ※EUC程度の規模でしたら、第三正規形で十分ですよ。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

正規化については http://www.netlaputa.ne.jp/~hijk/study/ae/datnom.html のサイトが非常にわかりやすかったです。ありがとうございました。理論的にテーブルを作れそうです。

関連するQ&A

  • DBのテーブルの使用量

    現在、PostgreSQLを使用してWebアプリケーションを作成しています。 いくつか、テーブルがある中で、一つのテーブルが使用している容量をしるSQLコマンドってあるのでしょうか。 SQLコマンドでなくてもかまいませんので、使用量が分かる方法を教えて頂けないでしょか。 よろしくお願いします。

  • テーブル定義書(Oracle) 【IX】項目

    いままではソフト系の開発を行っていたのですが、 今度、DBまわりの業務を行うことになりテーブル設計書を作成しております。 初めてなので、社内のテーブル定義書を参照しながら作成していると 番号、列名、列ID、データ型、桁数、NULL、PKの次から【IX1】...【IX10】という項目が並んでおり Googleで調べましたがインターネットエクスチェンジの略などの基本情報は載っていましたが、 実際にテーブル設計に関係のある項目かどうかは具体的に理解することは出来ませんでした。 識者の方がいれば、テーブル設計書においてこの項目の意図することはなにかを教えていただきたいです。 以上、よろしくお願いします。

  • Accessでリンクしたテーブルのリレーションが設定できない

    PostgresへA5SQLとか言うツールを使ってテーブルを2つCreateTableしました。 テストデータも入力しました。 あらためてAccessでPostgresのテーブルをリンクテーブルとして参照しデータを見ることが出来ましたが、Access上でリレーションが未定義でサブフォームを作成することが出来ません。 リレーションを1:多で作成しようと思うのですが、設定フィールドが真っ白でいじれません。 何故でしょうか? 基本的にCreateTableするときに、なにやらリレーション設定する構文が必要だったのでしょうか? 今は、CreateTableしか構文は記述されていません。 どなたかご教授ください。 よろしくお願いします。

その他の回答 (6)

  • 回答No.7
  • katuya
  • ベストアンサー率33% (38/115)

>一概には言えないと思いますが・・・。 その通りだと思います。 システム設計者は、利用者の業務内容からネットワークやDBサーバへの負荷(各クエリーによるディスクアクセス数やその出現頻度まで)を考慮する必要があります。 が、ある程度高度な知識が必要のため、「正規化という基本はおさえておきましょう」程度の意味で書きました。 質問内容から勝手に規模を推測しての回答です。 誤解があったならお詫びします。 では。お勉強がんばってください。> holydevilさん

共感・感謝の気持ちを伝えよう!

  • 回答No.6
  • Binder
  • ベストアンサー率33% (5/15)

> EUC程度の規模でしたら、第三正規形で十分ですよ。 EUCというのはデータウェアハウスの事を言われていると思うのですが、テーブル数やデータ件数の多さ、稼働するサーバーの能力によっては、データウェアハウスでも逆正規化を行わないとレスポンスを確保できない場合もあると思いますので、一概には言えないと思いますが・・・。 必要により、検索に適した結合済の参照専用テーブルを作り、レスポンスを確保する方法もありますので、御参考までに(^o^) > holydevilさん

共感・感謝の気持ちを伝えよう!

  • 回答No.4
  • Binder
  • ベストアンサー率33% (5/15)

Binderです。こんばんは。 ご質問の内容のことを、専門用語で「正規化」と呼びますので、御自身で文献調査などをされるときはこのキーワードで検索を。 正規化には、第1正規形~第3正規形まであり、第3に近づくほど、”綺麗な”もしくは”美しい”データ構造になります。 ”経験でわかる”とその方が言われるのは、ある意味で、この正規化の美しさを探求する意味でもあり、それを言葉で伝えにくいのは、美術・芸術作品の良さを言い表しにくいのと似ています。 で、たまたま見つけたサイトで、他のサイトよりはわかりやすいだろうと思うのがこちらです▼ http://ha1.seikyou.ne.jp/home/hidechan/jouhou/seikikariron.html --- holydevilさんの近い将来の話になりますが、正規化を探求しすぎると、小さいテーブルが多くなり、リレーショナルを通して検索するときに、物凄く検索速度が落ちる場合があります。 いわゆる”正規化の度が過ぎた”状態です。 この度が過ぎた正規化を逆方向に緩和してあげることを、ずばり「逆正規化」といいます。 正規化と逆正規化の間で悩み、落ち着いたところが最終状態のデータ構造になるのです。

参考URL:
http://ha1.seikyou.ne.jp/home/hidechan/jouhou/seikikariron.html

共感・感謝の気持ちを伝えよう!

質問者からのお礼

難しいけど時間かかければ理解できそうです。(たぶん)ありがとうございました。

  • 回答No.3
  • yaasan
  • ベストアンサー率20% (1377/6751)

 テーブルを分けることが大事なのは一つのテーブルが 大きくなりすぎないようにするためです。データ量や項目 数によって動作の悪くなる危険性がありますので、 あらかじめ予測できる大きさでテーブルごとに区切ります。  また、一つのテーブルに項目数が多すぎるとデータが 調べにくくなる事もありますので、一つのテーブルあたり の項目数を減らすためにテーブルを複数にすることもある と思います。  では、どうやって分けるかというとDBですから、 データの管理、集計が主な必要作業となってくると思い ます。その集計を一度にする項目ごとでテーブルを作成 するのが、良いかと思います。  例えば、顧客の購入品と住所を管理する場合、購入品に 関係する項目でテーブルを一つ、住所に関係する項目で テーブルを一つ、という感じで作っていっては々でしょうか?  また、なかなか初心者一人ではDBは作成できません ので周りの経験者に聞きながら作っていくのがよいでしょう。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございました。やっぱりDBは経験がいるんですね。単なる知識だけで通らないだけに難しいです。

  • 回答No.2
  • ARC
  • ベストアンサー率46% (643/1383)

とりあえず、必要なテーブルを一つ作ってみてください。作成する場所は、紙の上でも、EXCELの表でも、頭の中でも構いません。 で、そのテーブルに、テストデータを幾つか入力してみてください。 個人テーブル 氏名 都道府県 住所 ああ 鹿児島県 どこそこ いい 鹿児島県 あっち うう 沖縄県  こっち ええ 鹿児島県 むこう 同じデータを何度も入力しなければいけないフィールドはありますか?(上例では「都道府県」) そういったところが、「テーブルを分割してもいい」ポイントです。 上例の場合、分割すると、 都道府県テーブル TID 都道府県 1 北海道 2 青森県 :  : 46 鹿児島県 47 沖縄県 個人テーブル 氏名 TID 住所 ああ 46 どこそこ いい 46 あっち うう 47 こっち ええ 46 むこう のようになります。 分割前は[都道府県]フィールドに8バイト必要だったのが、分割後は1バイトで済むようになりました。また、入力ミスも未然に防げるようになりましたし、都道府県で検索する際の検索速度も上がっている筈です。 「絶対に一つのテーブルにまとめておかなければならないデータ」ってのは、理論上は存在しません。どのようにテーブルをぶった切っても、後から自由に結合して、元のテーブルに再構成できるのがRDBの特徴です。 ですから、まずは必要なフィールドをすべて備えたテーブルを作ってみて、サイズ、速度的にメリットがある部分で、テーブルを分割してやればいいのです。(あまり細かく分割しすぎても、テーブルの管理が大変です。この辺のさじ加減は、実際にやってみて経験の中で覚えるしかないと思います。)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

わかりやすい説明ありがとうございました。ネットワーク/WEB系についてはそれなりに知識はあるんですが、DBに関しては素人です。今後もお世話になるかと思いますがよろしくお願いします。

  • 回答No.1
  • mnabe
  • ベストアンサー率33% (427/1283)

RDBの設計に関しては、それだけで本がかけてしまうくらいの(実際に売られている)量なので、私が教育された時に説明された時の記憶で、説明します。  最初、関係すると思われるデータを横一列に並べてみて、そこにデータを入れてみる。そうすると、縦に見て、同じ内容のデータが続く所があった場合には、その項目は別テーブルにして、リレーションをはるのがベターである。  また、別テーブルにしたフィールドに関し性質を書いてみる。その性質毎にまとめてみる、性質が似ている物が、テーブルを同じく出来るようなら、同じテーブルとして作ってみる。  って事を、繰り返して最適化を行えば、良い設計に近づく事が出来ると教わりました。  結局、最後に必要なのは、どれだけ設計を行って、どれだけ最適化を行ったかの経験だけですけどね(^^;  人が設計した物でも、なんでそう考えるのかを考えるだけでも、十分な勉強にはなると思いますよぉ

共感・感謝の気持ちを伝えよう!

質問者からのお礼

なんとなくイメージがつかめました。ありがとうございました。

関連するQ&A

  • 学生 科目 課題のリレーション

    テーブルの設計をしています。 現在はACCESS2003で設計しており、ゆくゆくはSQLSERVER2005にしたいと考えています。 今現在あるテーブルは学生・科目履修・科目です。 順に1対多、多対1でリレーションを作成しています。 これに課題テーブルを作成したいのですが、どのようにリレーションすればいいか、分りません。以下課題の条件です。 ・課題には課題コードがあります。 ・1科目には必ず複数個の課題があります。 ・科目により課題の個数は違います。 ・学生1人1人に課題の点数を入力する必要があります。 私なりに1週間ほど考えたのですが、結局は科目履修とは別に、学生・実習・課題のようにテーブルを定義して1対多、多対1のリレーションしかないのでしょうか? しかしあまりにひどいリレーションになってしまいます。入力も時間がかかります。もっときれいに理論的に整理されたリレーションが作れないでしょうか? お手数でしょうが、ご教授ください。

  • 「主テーブル」ってどっちの事?

    テーブル/クエリ(T) と リレーションテーブル/クエリ(R) のどちらが主テーブルになるのでしょうか? リレーションシップを作成しようと思ったら 「このリレーションシップを作成して、参照整合性を設定 できません」 となるので確認したいのですが、主テーブルはどちらの事ですか?

  • ACCESS2003のテーブル入力について

    いつもこちらでお世話になっております。よろしくお願いいたします。 マイクロソフトアクセス2003にて、No.と項目名という2つのフィールドから成り立つテーブルがあります。 そのテーブルにはあらかじめデータがはいっています。 新規にそのテーブルに追加する項目が出来たとき、新規入力用のフォームを作成しました。 その時のNo.のフィールドなのですが、自動的にもともとあるテーブルの番号に無いものを規定値として表示させておくようにするには、どのようにしたらよいでしょうか? 例) 1、2、3、5があれば、4を 1、2、3、4があれば5を よろしくおねがいします。 もうひとつ質問なのですが、納品書を入力していくデーターを作成しているのですが、納品書のテーブルがあり、リレーションで項目や会社名などを関連テーブルとしています。 あらかじめ会社名や項目名のテーブルに入力されていない新規の会社の納品書を打ち込む場合、納品書テーブル入力フォームに、入力しただけで、項目名のテーブルや会社名のテーブルに追加されていく方法はありますでしょうか?

  • 掲示板のDBテーブル設計について

    今phpとmysqlを使って掲示板を作ってみようと考えています。 そこでDBのテーブル設計なのですが、スレッド1つに対してレスポンス用のテーブルを1つ作るか、スレッドとレスポンスのテーブルを1つずつ作成して運用するかどちらがいいか迷ってます。 後者のレスポンステーブルを1つにまとめるのはやはりアクセスが集中しそうなのでよくないでしょうか? よろしくお願いします。

  • MySQL テーブルのリレーションシップ

    初心者です。MySQL4.1です MySQLでテーブルを複数作成したのですが リレーションを組むのを忘れてまして 後からリレーションを組みたいのです。 alter tableをどう使えばいいんですか?

  • ACCESSのリレーションが切れてしまいました

    素人で甚だ恐縮ではございますが、社内システムのACCESS2003のデータベースでリレーション定義が無くなってしまい、アプリで削除していないにも拘わらず主たるテーブルのレコードの各項目に"deleted"或いは"#deleted"が入ってしまいました。 リカバリーは、「データベースの最適化/修復」を行い、リレーションを定義していた先のテーブル内のレコードを削除し、再度リレーション定義し再登録にて回復しました。 リレーションが切れる(無くなってしまう)原因がわかりません。 どういったケースで発生しうるかご教示頂ければと存じます。

  • DB設計に要する見積もりについて

    新規のシステムで、全体の見積もりを行う中で、DBだけに注目して容量の算出、テーブル作成、正規化等プログラミングする前にいろいろやる事があると思いますが、その部分だけの作成にはどのような情報があれば、工数を算出できるのでしょうか? 勿論、テーブルの数や名前、その中の項目数や項目名、収まるデータ量なんか はDB作成以前の設計段階での工数見積もりに入ってくると思うので、ここでは DB見積もりから除外して考えております。 宜しくお願い致します。

  • 2つのaccessテーブルのレコード数を合わせたい

    一つは200レコードあるリンクテーブルです。 このリンクテーブルとあるテーブル(Bテーブル)を合体させたいと思いました。 そのあるテーブルは主キーであるIDとチェックボックスの2つのフィールドだけです。 このB]テーブルの主キーとリンクテーブルの主キーとリレーションでつなげました。 しかし、そのBテーブルはレコードが全く無いのでチェックボックスが出て来ません。 リンクテーブルのレコード数分、手動で作成したらチェックボックスと組み合わさります。 これでは、毎回毎回リンクテーブルのレコード数を数えて同じ分だけBテーブルでレコードを作成しなくてはいけません。 自動で同じだけのレコードを作ることはできますでしょうか? VBAでレコード数を数えて・・・・とかするのでしょうか?

  • 【MySQL】1対1でテーブルをあえて分ける

    mysqlを使用してデータベースを作成しているのですが データベースでテーブルを分けるときって 【アカウントテーブル】 ID アカウント 名 アカウント パスワード 名前 住所 電話番号 職業 【職業テーブル】 職業ID 職業名 というような1対多というのはよく組むとおもうんですが 下記のような 【アカウント情報テーブル(アカウント情報)】 アカウントID アカウント 名 アカウント パスワード 【アカウント情報テーブル(プロフィール情報)】 アカウントID 名前 住所 電話番号 職業 1対1の関係でテーブルをジャンル(エンティティ)ごとに複数にわけて あとでリレーションして一個にまとめるというのはデータベース的にあまりよろしくないのでしょうか? 何故、こんなことしたいかというと、1テーブルあたりのカラム数がかなり多くなってくると PHPでデータベースを書き込んだり呼び出したりする時に毎度多くのカラムを取り扱わなければならず SELECTで、カラムを一個一個選んで行かないといけません。 しかし、取り扱いたいカラムは大抵の場合あるジャンルだけなので リレーションするかしないかで、あるジャンルのデータだけを取り扱えれば 効率がよくなるのでは? というのがあります。 また、視覚的にカラムの把握もしやすくなります。 この1対1テーブルは、DB設計的にどうなでしょうか?

    • ベストアンサー
    • MySQL
  • 【access】テーブルの項目順が意図せず変わる

    access2010を使用しています。 ローカルテーブルの項目順について質問します。 詳しい方、ご教示ください。 デザインビューで表示される項目順とデータシートビューで表示される項目順が、意図せず変わる事象が時折発生します。 ※デザインビューに1、2、3の順で並んでいるものが、データシートビューだと1、3、2の順になっている テーブル定義はデザインビューのもので作成しているので、そちらの項目順でデータシートビューでも表示したいのですが、なぜ意図せず変わってしまうのかが分かりません。また、解決方法も分からないです。 【補足】 ・テーブル:ローカルテーブル ・テーブル定義を登録した直後は意図した項目順で表示される →VBAやQueryを実行した後にデータシートビューで確認すると項目順が変わっていることがある。(必ず変わっているわけではない) どなたか、ご教示頂けないでしょうか。

専門家に質問してみよう