質問: ネットワーク図のデータベース設計 データベースのテーブル設計を考えています。 多数の「ノード」があり、「エッジ」(そのノード同士の関係)をデータベースに記録したいと思っています。 例えば、a, b, c, d, e という5つのノードがあり、 「aとbは関係がある(関係の分類:x)」 「bとcは関係がある(関係の分類:x)」 「cとdは関係がある(関係の分類:x)」 「dとaは関係がある(関係の分類:x)」 「aとeは関係がある(関係の分類:y)」 「bとdは関係がある(関係の分類:z)」 という事を表現したいのです。 図:等幅フォントでないと崩れてしまうと思いますが、一応...。 e +---+ | | | a-b-c-d | | +-----+ ここで私が考えたのは、テーブル「node」と「edge」を用意します。nodeには、"ノードid", "ノード名"(a~e等) フィールドを作り、edgeには "ノードid1", "ノードid2", "関係" フィールドを作ります。 node : 1, a 2, b 3, c 4, d 5, e edge : 1, 2, x 2, 3, x 3, 4, x 4, 1, x 1, 5, y 2, 3, z このように記録しておけば、ネットワーク図をデータベース化することができると思います。 ただ、この場合、edgeテーブルで 1,2,x と 2,1,x は、同じ関係を違う表現で表記してしまうので、混乱の元になってしまいそうです。また、edgeテーブルから「aと関係があるノードをリストアップしたい」場合も、何だかスマートではない気がするのです。 こういった事例では、どのようにデータベースを設計すると良いのでしょうか? # mysqlカテゴリで質問させて頂きましたが、postgresの独自機能により解決できるパターンもありましたらご指摘頂ければ幸いです。
回答: すいません、スペースが詰まっているので、まちがっているかもしれませんが、 edgeに方向性がないとするならば、 a->bとb->aが冗長だということですよね? ならばedgeごとにidを付与して、そのedgeidに対してノードがかならず二つぶら下がるという関係にしてはどうでしょうか? 【】←これがエンティティだとして。 【edge】1--2【edge関係】n--1【ノード】 こんな感じですが。