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

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

ただいまの
回答率

90.52%

  • データベース

    698questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

  • アルゴリズム

    408questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

MySQLに、ネットワーク構造を格納する方法

解決済

回答 3

投稿

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

zodiac

score 6

題名の通りなのですが、MySQLに、ネットワーク構造(この言い方が正しいかどうか、わかりませんが…)を、
格納する方法を考えていますが、なかなか良い案が、見つかりません。

ネットワーク構造と書いたのは、WEBのサーバ同士がつながっているような感じで、
一つの丸から、複数の線が出ていて、その線で、他の丸と接続していて、
線の数、丸の数も、固定数ではなく、複数の線が出ていて、複数の丸と接続している丸もあれば、
一つの線しか出ていなくて、一つの丸とだけ接続しているものもある。
と書けばイメージ、伝わるでしょうか?

この、お互いの接続関係をDBに格納し、一つの丸を指定すると、それに接続されている丸を、
すべて見つけてこれるようにしたいということです。
丸の数、線の数に上限がない(と言っても計算負荷などから考えて常識的な数にはしますが)ので、
丸が追加されると、接続関係も、増えていきます。
ですが、接続が、全く増えない丸も、中にはあります。
こんな、構造を、どんな風にDBで表現したら、良いのか、悩んでいます。
わかりにくい説明で、申し訳ないのですが、調べてみても、
良い方法を見つけられなかったので、もしも、良い案がありましたら、
ご教授頂けると幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+3

こんにちは。

たぶん、それはグラフのことと思います。
グラフをコンピュータ内で表現する方法はたくさんあります。

データベースで表現できる方法としてパッと思いつくものは、ノード=レコードとして各レコードの可変長フィールドで他のレコードのユニークなキーを記録することです。
これで有向グラフ(ノードからノードへ矢印でリンクする)を表現できます。
そして、効率は良くないですが必ず逆方向のリンクも用意すれば無向グラフにできます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/16 22:51

    お返事、ありがとうございます。
    イメージ、伝わって良かったです。私の作りたいものは、グラフと言うのですね。
    不勉強で、お恥ずかしい限りです。

    ノードを、レコードとして、そのノードにつながっているノードを、全て、そのレコードに記録していくという形ですね。
    ノードの数が増えたら、レコードを増やせばいいので、それは楽ですよね。

    MySQLも、初心者なので、間違っていたら、ご指摘いただきたいのですが、ノードのキーが、例えば通し番号として、その数字を文字列にして、カンマ区切りとかで、可変長フィールドに、書いていくという感じの実装になるでしょうかね? それで、処理する時は、カンマで、splitして、つながっているノードを得るという方法かなと思いました。
    わかりやすい、方法かなと思いましたので、検討してみます。ありがとうございます。

    キャンセル

  • 2017/02/16 23:02

    考え方はその通りです。
    可変長配列のようなものがMySQLにあればもっと効率良くできると思いますが、すいません。データベースを使い込んだ経験がなく詳しいことは分かりません。

    キャンセル

  • 2017/02/16 23:06

    いえいえ、ありがとうございます。これで、よくわかりましたので、大丈夫です。
    可変長の配列とか、あったら、きっとすごく便利ですよね。

    キャンセル

+1

全部の丸に一意の通し番号を振り、

CREATE TABLE edge (
  from INTEGER, // 線の入り口の丸#
  to INTEGER // 線の出口の丸#
)


で、いかがでしょ?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/16 22:56

    お返事、ありがとうございます。
    これは、丸の情報ではなく、接続情報をレコードに持つということですね。

    この場合だと、fromに目的の丸が書いてあるレコードを探して、そのtoの値を取ってくれば、その丸とつながっている全ての丸を得られるということですよね?

    こういう方法も思いつかなかったです。検討してみます。ありがとうございます。

    キャンセル

  • 2017/02/16 23:05 編集

    ですね。SELECT to FROM graph WHERE graph.from=3 で3番からの接続先が得られます。
    方向を持たないのであれば (x,y) と (y,x) の両方をテーブルに突っ込んでおけば。

    キャンセル

  • 2017/02/16 23:11

    SQL文も書いてくださって、本当に、丁寧なご回答をありがとうございます。
    方向を持たない、接続関係のデータですので、両方を入れておく必要があるのですね。
    それも、書いていただいていなければ、きっと忘れていたと思います。感謝します。

    キャンセル

  • 2017/02/17 08:41

    薀蓄垂れるなら、こいつはグラフ理論で扱う隣接行列のCOO-format(Coodinate-format)って呼ばれる疎行列(sparse matrix)の表現形式です。

    キャンセル

  • 2017/02/21 21:09

    お返事、遅くなりました。すみません。
    これは、そういうものなのですね。
    こうして、キーワードが、わかるだけでも、調べる取っ掛かりができるので、本当に助かります。
    ありがとうございます。

    キャンセル

check解決した方法

0

お二方に、別の方法を教えていただけたので、とても参考になりました。
どちらにするのが良いのか、ちょっと、まだ決めかねておりますが、
全く、思いつかなかったので、考えるヒントを頂けて、助かりました。
ありがとうございます。

ベストアンサー、お二人にしたいのですが、お一人にしか付けられないようなので、
はじめに回答くださった、Chironianさんに、付けさせてください。

ご親切に、ありがとうございます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/16 23:01

    ああ、これを投稿したら、ベストアンサー付けられなくなってしまうのですね。
    すいません…。間違いました。

    キャンセル

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

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

関連した質問

  • 受付中

    mysqlで演算処理をさせるべきかAP側でやるべきか

    あくまで一般論としてお聞きしますが、mysqlで演算処理をさせるべきかAP側でやるべきかを伺いたいです。 mysql側で複雑な計算処理(特定の条件に符号するテストの平均点や偏差値

  • 受付中

    mysqlの起動(windows)

    mysql5.6をwindowsにインストールし,コマンドプロンプトからの起動を試みました. mysql -u root -p としたところ以下のようなエラーメッセージが表示さ

  • 受付中

    mysqlインストール(windows)

    mysqlのインストール(windows)についてです. インストーラーはmysql-installer-web-community-5.6.26.0.msiを使用しました. [規

  • 受付中

    JAVA MySQL接続について

    JAVAとMySQLを使ってDBからデータを取りだしたいと思っています。 そこでデータベースへのコネクションが作成されない原因が特定できないので質問しました エラーメッセー

  • 解決済

    MySQLで膨大な数のレコード全体に、別テーブルからのデータを用いてUPDATEをかける手法

    前提・実現したいこと 1レコードのカラム数が200を超え、レコード数が30万件近くあるテーブルに対し、 別テーブルから引いてくるデータを使ってUPDATEをかける必要が出来てし

  • 解決済

    ローカルPC内のmysql接続のIP

    アプリ開発中なのですが、 mysqlへの接続で、自PC内のmysqlなのにtcpdumpで見るとグローバルIPで接続しているのを発見しました。 なぜでしょうか? 自PCなのに

  • 解決済

    身に覚えがないが接続が拒否される

    MySQLへのアクセスを信頼できるホストに限定しようと思い、ひとまず現状を把握しようと以下のコマンドを実行したのですが、 telnet IPアドレス 3306 次のように表

  • 解決済

    CentOS7に mysqlを導入できない

    自分が使用しているLinux PCにmysqlを導入しようとしているのですが 下記のような状態になってしまいうまくいきません。 使用OSは CentOS Linux release

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

  • データベース

    698questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

  • アルゴリズム

    408questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。