質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.05%

  • MySQL

    4944questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • データベース設計

    118questions

    データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

  • パフォーマンス

    19questions

    コード効率の向上や計算に関する質問には、このタグを使ってください。

一覧画面表示用のテーブル

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 145

annderber

score 49

お世話になります。

一般的な業務システムなどで、一覧画面がありそこから詳細画面に飛ぶというというような処理があると思います。
テーブル構成は一覧画面用テーブルが親で、子に明細テーブルが紐付くというような感じです。
ここで一覧画面に明細テーブルにあるデータを表示したいという要件がでてきた場合、テーブルを結合する必要が出てきますが、結合するテーブルの数がかなり多くパフォーマンスの問題が発生してしまいます。

という想定で、一覧画面用に詳細テーブルのデータを登録するフィールドを設けるのはアリでしょうか。
同期する必要があったり、親子関係がおかしくなったりする気もしますし。
アリだとすると設計方法のグッドプラクティスはあるのでしょうか。

そもそもパフォーマンスの問題と言ってもレコード数によっても変わってくると思います。
例えば、ページャーなどで一覧画面に表示できる件数を20件程度に絞ってからjoinをかければ
パフォーマンス的にはそれほど問題ならなくなったりするのでしょうか。自分で調べろと言われそうです。。。

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

個人的意見ですが、
そもそも、一覧用のテーブルがあるのが、おかしいと思います。
詳細画面のテーブルがあり、それを絞って表示するのが、一覧画面だとおもいます。

結合条件もキー結合であれば、1000万件ぐらいなら、処理速度的にさほど問題にはならないです。
※一括、全件取得は不可(テーブルは10テーブルぐらいを想定)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/12 10:42 編集

    コメントありがとうございます。

    一画面用というか親テーブルですね。請求書管理があったとしたら、おそらく請求書テーブルの下に請求明細テーブルが紐付くと思います。そうするとたいてい一覧画面に表示するのは親テーブルの一覧ですよね。

    設計次第なら1000万件でもパフォーマンスにはあまり影響がないですか!
    ページャー等で一画面あたりのレコード数を絞れば問題なさそうですね。

    キャンセル

  • 2018/01/12 11:26

    これも個人的な意見ですが、よほど項目数が多くなければ(200項目orver)、
    1対1のテーブル構成は作りません。
    カラムの増加によるコストより、結合によるコストが大きいです。

    過剰な正規化ではないですか?

    キャンセル

  • 2018/01/12 11:28

    追記:トランザクション管理によるテーブルの細分化はします。

    キャンセル

+2

一覧画面用に詳細テーブルのデータを登録するフィールドを設けるのはアリでしょうか。

は、要件内容や前提条件、制約条件によると思います。

個人的な見解になりますが、
基本的には、一覧画面に詳細テーブルのデータを登録するフィールドを設けるのはお勧めしないです。

一覧画面に登録・編集機能を設けた場合、一覧に表示しているデータは、他の誰かに編集されないようにロックを行う必要が出てきます。

課題(機能仕様として設計しておくべき内容)としては、次のようなことが考えられます。
・一部のデータがロックできなかった時の扱い
・一部のデータを更新できなかった場合の扱い
・一部のデータのロック解除に失敗した場合の扱い など

データレコードをロックするのではなく、テーブルロックや画面ロック(誰かが開いていれば、他の人は開くことができない)であれば、いくつかの課題はクリアできますが、利便性の問題が出てきます。
(基幹系システムなどで、一人しか処理ができない仕組みは致命的です)

ただ、利用者が1名しかいない場合などは、問題ないかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/12 10:38

    コメントありがとうございます。

    質問としては親テーブルに子テーブルのサマリー用のフィールドを設けるのはアリかというものです。
    一覧画面に登録編集機能を設けるということではありません。

    キャンセル

+2

リレーションが複雑でパフォーマンスがでないのであれば
サマリーをつくっておくのは悪くない選択肢だと思います
ただし期間を絞って締め処理など行わないと、サマリーをつくる範囲が
つねにデータの先頭からになってしまうので、確定データの運用方法については
設計段階で熟慮が必要です

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/12 10:43

    コメントありがとうございます。

    単純に明細テーブルのデータを更新する際に同一トランザクションで親テーブル側も更新するというのでは問題あるのでしょうか。

    キャンセル

  • 2018/01/12 10:45

    具体的なサンプルの例示がないのでなんともいえません
    子データを投入すると紐付いた親データのidを元に親データ管理テーブルの内容が
    更新されるイメージでしょうか?
    であればトリガーを設定しておけばよいかもしれません。

    ただし例えば、親データp1対して子データc11,c12、親データp2対して子データc21,c22,c23が
    ぶら下がっているとして、c21の親情報をp2からp1に変更するときは
    p1とp2両方に対してサマリーの更新が必要になります。
    漏れがないよう仕様を検討してみてください

    キャンセル

  • 2018/01/12 15:46

    すいません。
    なぜトリガーを使うといいのかが分かりません。

    キャンセル

  • 2018/01/12 16:40

    > なぜトリガーを使うといいのか

    入力をすると自動的に別テーブルを更新できるからです

    キャンセル

  • 2018/01/12 16:44

    なるほど同じデータを入れるならトリガー使った方がいいですね

    キャンセル

checkベストアンサー

+1

人間が一覧を見て詳細へ飛ばすのですから
表示できるデータ量というのはしれていると思います。
例えば一覧で1万件をスクロールして探すとかになることはほとんどないので
私ならwhereが適正なら多少joinの数が多くても都度計算してやりますね。
計算でやれることは計算でやりたいところです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/12 15:47

    コメントありがとうございます。

    最初から絞り込めばパフォーマンスへの影響はかなり軽減できると言うことですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    WordPressで複数ブログ、シングルサイトとマルチサイトでサーバ負荷に違いはありますか?

    WordPressで複数ブログ、シングルサイトとマルチサイトでサーバ負荷に違いはありますか? マルチドメイン対応、データベースを5個まで作成OKのレンサバで、3つのブログを作

  • 解決済

    [Oracle SQL]INSERT INTOされる度に社員番号を自動挿入したい

    皆様、いつもお世話になっております。 ただいま私はOracle DBA 12cの勉強をしておりまして、教材に乗っているような社員番号を主キーとした行を生成したいと思っています

  • 解決済

    論理設計と物理設計

    「達人に学ぶDB設計徹底指南書」(2012、ミック著)という本を読んでいたのですが、論理設計と物理設計の関係がよくわかっていません。 本に次のような記述があります。 「(中略)

  • 解決済

    任意の数字6~8桁の中に、任意の数字5桁が存在するかの判断

    MySQL+Python3.5環境下で開発しています。 現在、Excelでまとまっている数式をPythonで記述し、MySQLに流し込み、PHPで表示という方法で開発を行って

  • 解決済

    dmpファイルの管理

    dmpファイルの管理についてなのですが、毎日デーリーで深夜にバッチで dmpファイルを取っています。データの量が膨大な為管理方法を考えたいのですが どのように管理すればいいので

  • 解決済

    SQL Server 番号振り

    SQL ServerにAテーブル、BテーブルがありINSERT INTOで保存するときに連番が自動的に振り分けられるIDENTITYを使用していました。 しかし私の作っているものに

  • 解決済

    セッションをリフレッシュ!!

    ユーザーを伴うWEBシステムの設計などにおいて ユーザーが設定画面などで自身の情報を変更する際、変更後の新しい情報をセッションに入れるとき、セッションを一度消してから新たにPD

  • 解決済

    SQLのパフォーマンスについて

    オンラインの処理でデータをデータベースより取得してダウンロードをする機能を作成しています。 大量データ下でのSQLのパフォーマンスが悪くjavaでの処理を含めて10分以上かかってい

同じタグがついた質問を見る

  • MySQL

    4944questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • データベース設計

    118questions

    データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

  • パフォーマンス

    19questions

    コード効率の向上や計算に関する質問には、このタグを使ってください。