• ベストアンサー

可変個数のデータはどう納める?

データベースについてほとんど知識のない者です。 「本の索引を兼ねた用語事典」を作るとします。 項目にある「何ページに記載」の情報は、 ある項目では1箇所だったり、ある項目では数百箇所だったりします。 このような可変個数のデータを収めるには、 どういう方法があるでしょうか? コード化して、可変長文字列形式でデータベースに入れれば 実現できると思いますが、それもみっともない気がします。 また、そうすると「特定のページから記載項目を取り出す」 ことも難しくなります。 考えてみれば、レンタルビデオや電話会社の利用経歴など、 可変個数のデータを記録する処理は多くの場所で行われています。 そういう場合一般的にはどうしているのでしょうか? あるいは、これらの処理はリレーショナルデータベースには 向いていないのでしょうか? 非常に初歩的な質問だと思うのですが、ご教示をお願いします。 また根本的な勘違いがあったらご指摘下さい。

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

  • ベストアンサー
  • cse_ri2
  • ベストアンサー率25% (830/3287)
回答No.2

マスタテーブルと明細テーブルに分割すればよいかと。 たとえば、以下のような項目名と関連するページのデータ があった場合を想定します。 上野, 2, 4, 100, 502 秋葉原, 5, 52 東京, 1, 10, 77, 304, 1000, 1020 … … このように項目によって、データの個数が変化している場合、 可変長項目が設定可能なオフコン系のRDBを除きますが、 テーブルを分割し、共通のコードでリンクするようにします。 以下に、その例を記述します。 <索引マスタ> 1.索引コード 文字型 2.索引名   文字型 <索引明細> 1.索引コード 文字型 2.明細番号  数値型 3.格納ページ 数値型 ※データの格納状況 <索引マスタ> 0001, 上野 0002, 秋葉原 0003, 東京 <索引明細> 0001, 2 0001, 4 0001, 100 0001, 502 0002, 5 0002, 52 0003, 1 0003, 10 0003, 77 0003, 304 0003, 1000 0003, 1020 この二つのテーブルを、Select文で結合して取り出すことで、 目的のデータを抽出することができます。

liar_adan
質問者

お礼

ありがとうございます。 例を出して頂いて、参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • cse_ri2
  • ベストアンサー率25% (830/3287)
回答No.3

No.2の回答の修正です。 テーブルのデータの格納に誤りがありました。 ※データの格納状況 <索引マスタ> 0001, 上野 0002, 秋葉原 0003, 東京 <索引明細> 0001, 1, 2 0001, 2, 4 0001, 3, 100 0001, 4, 502 0002, 1, 5 0002, 2, 52 0003, 1, 1 0003, 2, 10 0003, 3, 77 0003, 4, 304 0003, 5, 1000 0003, 6, 1020

全文を見る
すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

正規化をします。 http://www.kogures.com/hitoshi/webtext/db-seikika/index.html >非常に初歩的な質問だと思うのですが、ご教示をお願いします。 >また根本的な勘違いがあったらご指摘下さい。 非常に重要なことですのでぜひしっかりと勉強してみてください。

参考URL:
http://www.kogures.com/hitoshi/webtext/db-seikika/index.html
liar_adan
質問者

お礼

ありがとうございます。 やっぱりごく基礎的なことで躓いていたのがわかりました。 参考URLも見て勉強します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBによる可変長ファイルの読み書き

    VB5で固定長、可変長の2種類のファイルを読み込み、編集して、またファイルに書き込むという処理を作成します。 固定長は、構造体にしてランダムアクセスによって、一気に読み書きしています。 問題は可変長のときどのようにファイルアクセスをし、読み書きするのがいいのかよくわかりません。 ファイルデータのフォーマットは 項目   属性  データ長 6バイト データ  可変 データ長 6バイト データ2 可変 ・ ・ ・ といくつか可変長のデータが並びます。 バイナリーでアクセスし、1つ1つ区切りながら読み込むしかないのですか? よろしくお願いします。

  • Commit しなかったデータは、どうなる?

    リレーショナルデータベース管理システムについて確認したいのですが。 バッチ処理とかの途中でシステムがダウンし、Commit しなかったとき データベースは、Commit していないのでトランザクション開始前の状態が 維持されると思うのですがその理解で合っていますか? Commit しなかったトランザクションデータは、破棄されると思うのですが その理解も合っていますか? MySQL の場合について、教えてください。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • phpで、可変項目のcsvデータを読み込みたい

    csvでデータを読み込む方法はネットで見つけたのですが、下記の条件を加えた場合どうすればいいか分かりません。 ネットで見つけた方法は、ファイルを1行ごと読み込み、コンマごとに区切って配列にいれる方法です。 しかし、項目が可変の場合、名前を入れたいところに別のデータが入ったりします。 【条件】 csvの項目名は、 A,B,C,D,E,F とする それぞれの項目は、省略可能(どこが省略されるか分からない) そのため、 A,D,E,F など、項目名が少ないCSVファイルもある。 こんな場合は、どのように処理をすればよいでしょうか? 実際は、項目名が50個ほどあります。 今回の例のように、少なければ何とかできそうなのですが・・・ 【補足・データファイル】 "A","B","C","D","E","F",←項目名 "山田","太郎","東京","15","123-221","男",←データ "山田","次郎","東京","13","124-567","男", ・・・・・・・・・↓続く ・・・・・・・・・

    • ベストアンサー
    • PHP
  • オラクルのデータ型について

    オラクルのデータ型について教えてください。 ものすごく基本的な質問かもしれませんが、今後のことを考えて質問させていただきます。 文字列の型の"CHAR"と"VARCHAR2"についてです。 "CHAR"は固定長で2000バイト、 "VARCHAR2"は可変長で4000バイトとマニュアル等には記載されていますが、 いまいちピンときません。 そこで、それぞれの長所、短所。どのような時にどちらを使用したらいいのか 等をなるべく詳しく教えてもらえないでしょうか? 宜しくおねがいします。

  • 過去データに対するデータベースのクエリの実行の仕方

    こんにちは。アべです。 データの処理でリレーショナルデータベースを使用しようとしております。 そこで、台帳(例えば顧客台帳)をマスタ登録して使用するのですが、 下記のことがクエリでは出来ずに困っています。 やり方のヒントでもよろしいので教えていただけないでしょうか? ・過去に戻って、トランザクション処理を再実行する際に過去の その時点の台帳情報を引っ張りたい。 (テーブルに時間指定でクエリを投げる方法がわからない。) ・その台帳の情報を確認したい。 (単純に台帳の過去を知りたい。 トリガで更新処理のログを残す手間なやり方しか思い浮かばない。) 本をみてもリレーショナルデータベースに時間軸の概念がないような 気がしております。 (一応調べて見て、スナップショットデータベースがあり、これだと ある特定の時点しか取れず、しかも事前に用意しておかなければならず、 いまいち今回のパターンだと使えないと考えています。) 環境 SQL Server 2008 Service Pack 1 宜しくお願い致します。

  • エクセルデータから,索引を作成したい

    エクセルデータから,索引を作成したいと思っているのですが,よい方法はありませんでしょうか。 下記のように,A 列に項目,B 列にページ数が入力されています。 項目 ページ 猫   12 猫   16 猫   32 猫   55 猫   62 犬   15 犬   23 犬   25 馬   15 馬   17 馬   24 馬   25 馬   29 馬   31 馬   55 これを,以下のような索引形式に変更したいと思っています。 猫…12,16,32,55,62 犬…15,23,25 馬…15,17,24,25,29,31,55 使用するソフトはエクセルではなく,ワードや一太郎,秀丸などでも問題ありません。よろしくお願いします。

  • WORDで設定した索引項目を自動にブックマークすることは可能ですか?

    既に索引項目を設定したファイルがあります。 その項目を流用してクロスリファレンスでページ番号を表記したいのですが、自動に設定できる方法はありますか? せっかく索引項目としてマーキングしてあるので、新たにブックマークを設定することなく処理できたらと思うのですが・・・。 「索引」以外に、索引項目を部分的に抜粋して一覧を作成したいのです。 windows XP、WORD2007の互換性モードで作業(先方が2003使用のため) アドバイスお待ちしております。

  • メモリマップドファイルを可変長メモリプールとして

    だいぶ製作中のアプリケーションも、自作ファイル形式も かなり大きい(よほどの場合により数百MBとか)ファイルを扱う可能性が生じてきたので 必ず全部メモリに読み込むのは推奨できない、という状況になりました。 そこで 既存のファイルからは読み取り専用で メモリマップドファイルとして開き、普通のメモリ上に読み込まずともポインタ操作できるようにし 操作したい場合は読み書きできるメモリマップドファイルを、自分のアプリの指定フォルダに作業領域として作ったところから使用中だと判断出来るようにしておいて確保し アドレスはオフセット等で管理し、ポインタを移し替えたりする、という手を使い また、うまく処理を切り分けてやることにより 重要な個所についてはメモリ上に確保し、そこにデータにフィルタ演算するついでに移し替えたりするなど さまざまな手によって かなりの速度も実現出来ることが確認できました。 これはつまり、メモリではなくメモリマップドファイルを 可変長メモリプールとして使うという形になっています。 ただ、昨日思いつきで作って、とりあえず十分快適に動作は出来るけども、最適解かどうかは手探り状態、ともいえるので よりよい方法が考えらるならぜひ知っておきたいです。 と…書いてる途中で 今は「使用中」「未使用」のフラグとそのサイズを持たせたリストを、一方向にnextポインタでつなぐのみ、となっていますが 空きリストのみ(も?)収集して…という方法の概念を思い出しました。 あまり複雑になるとバグが出る危険性はありますが、試す価値はありそうです。 ただ ・まず、メモリマップドファイル自体については、作った後はそのファイル自体は固定サイズ、ってことで良いでしょうか? ・可変長メモリプールなどのアルゴリズムについて、把握するのに何日もかかりそうなあまり巨大なコードになりすぎない範囲で、考察したりオープンソースで作ったりしているサイトなどがあれば教えていただきたいです。

  • コンボボックス(プルダウン)からデータを持ってくる方法

    ウェブページについて質問です。PHP,MySQL,JavaScriptを利用したいと思っています。ページを表示させた時に、データベースからデータを取得してプルダウンメニュー1(コンボボックス)に値を表示させたいとします。さらにもう一つ、プルダウンメニュー2があり、1で選択した項目により、2で表示させる内容を変更させたいと思っています。 例えば、1のリストの中には、野菜、果物、お菓子とあって、野菜を選択した時には、リスト2には自動的ににんじん、ピーマン、きゃべつ などをセットしたいです。 データを一括で持ってきて、JavaScriptあたりで制御をすればいいのでしょうか?それともリスト1を選択した段階で、データベースにリスト2に表示する値をひっぱってこれば良いのでしょうか?またこの作業をするにあたって、ページをロード時にデータをプルダウン1にセットするように処理をしたいのですが、どのように処理をすればよいでしょうか?

    • ベストアンサー
    • PHP
  • アップデート処理時間について

    こんにちは。 UPDATE文で1,000件位のデータの項目を0(ゼロ)から1に 更新しているのですが、処理時間が5分程度かかっています。 索引は三つですのでそれ程多くは無いと思うのですが処理時間の短縮を図るにはどうすればいいのでしょうか。 よろしくお願いします。