Mysqlは隣接リスト(隣接リスト)を通じてツリー構造を保存します。

Mysqlは隣接リスト(隣接リスト)を通じてツリー構造を保存します。

以下の内容では、隣接リストを使用してツリー構造を保存する MYSQL のプロセスとソリューションを紹介し、保存された図を分析します。

今日は、もっと厄介な問題、つまりツリー構造をデータベースに保存する方法を見てみましょう。

MySQL のようなリレーショナル データベースは、テーブルのようなフラットなデータを保存するのに適していますが、ツリー構造のような深いデータに遭遇すると制御が難しくなります。

たとえば、会社の人員構成を保存する必要があります。一般的な階層構造は次のとおりです。

(絵を描くのは簡単ではありません。)

では、この構造をどのように保存するのでしょうか?そして、次の情報を取得します。

1. Xiaotian の直属の上司が誰であるかを調べます。

2. Lao Song の管理下にある直接従業員を確認します。

3. Xiaotianの上司全員を確認します。

4. Lao Wang によって管理されているすべての従業員を照会します。

解決策 1: (隣接リスト) は、現在のノードの親ノード情報のみを保存します。

従業員テーブルを作成する(
イードイント、
名前VARCHAR(100)、
位置 VARCHAR(100)、
親ID int

記録された情報は単純で粗いので、次の構造情報を保存します。

さて、それでは答えの部分に入りましょう。

1. Xiaotian の直属の上司に問い合わせる:

e2.eid、e2.ename を employees e1、employees e2 から選択します。ここで、e1.parent_id=e2.eid AND e1.ename='小天';

2. Lao Song の管理下にある直接従業員に問い合わせます。

e1.eid、e1.ename を employees e1、employees e2 から選択します。ここで、e1.parent_id=e2.eid AND e2.ename='老宋';

3. Xiaotianの上司全員を確認します。

ここで直接チェックする方法は絶対にありません。ループを使用してループ内でクエリを実行することしかできません。最初に直属の上司をチェックし、次に直属の上司の直属の上司をチェックする、というように繰り返します。このような面倒なことのために、まずストアド プロシージャを作成する必要があります。

目を開けてよく見てください。次のステップはショー操作です。

CREATE DEFINER=`root`@`localhost` FUNCTION `getSuperiors`(`uid` int) 戻り値 varchar(1000) CHARSET gb2312
始める
  上司をVARCHAR(1000) DEFAULTとして宣言します '';
  sTemp INTEGER DEFAULT uid を宣言します。
  tmpName VARCHAR(20) を宣言します。
  (sTemp>0)の間、
    SELECT parent_id into sTemp FROM employees where eid = sTemp;
    eid = sTemp の場合、従業員から ename を tmpName に選択します。
    IF(sTemp>0)の場合
      SET 上司 = concat(tmpName,',',上司);
    終了の場合;
  終了しながら;
    SET 上司 = LEFT(上司,CHARACTER_LENGTH(上司)-1);
  上司に返す。
終わり

このストアド プロシージャは、子ノードのすべての親ノードをクエリできます。試してみましょう。

はい、操作は完了しました。

どうやらこれ。子ノードの親ノードをすべて取得するのは面倒です。 。

4. Lao Wang によって管理されているすべての従業員を照会します。

考え方は次のとおりです。まず、親ノードが Lao Wang の ID であるすべての従業員の従業員 ID を取得し、次に従業員の名前を結果リストに追加し、マジカル検索関数を呼び出してマジカル検索を実行します。

CREATE DEFINER=`root`@`localhost` FUNCTION `getSubordinate`(`uid` int) 戻り値 varchar(2000) CHARSET gb2312
始める
str varchar(1000) を宣言します。
cid varchar(100) を宣言します。
結果をVARCHAR(1000)として宣言します。
tmpName VARCHAR(100) を宣言します。
str = '$' を設定します。
SET cid = CAST(uid as char(10));
cidがnullでない場合に実行
SET str = concat(str, ',', cid);
SELECT group_concat(eid) INTO cid FROM employees where FIND_IN_SET(parent_id,cid);
終了しながら;
SELECT GROUP_CONCAT(ename) INTO result FROM employees WHERE FIND_IN_SET(parent_id,str);
結果を返します。
終わり

驚くべき結果をご覧ください:

私はそれを理解しましたが、正直に言うと、それは簡単ではありませんでした。 。 。

この方法の利点は、保存する情報が少なく、直属の上司と直属の部下を確認するのに非常に便利なことです。欠点は、複数レベルのクエリを実行するのが非常に難しいことです。したがって、直接の上司と部下の関係のみを使用する必要がある場合、この方法は依然として適切な選択であり、多くのスペースを節約できます。その他のストレージソリューションについては後ほど紹介します。良いものと悪いものの絶対的な区別はなく、単にさまざまな状況に適しているだけです。

以下もご興味があるかもしれません:
  • MySQL ツリー構造データベース テーブル設計

<<:  Linux でユーザーをグループに追加する 4 つの方法の概要

>>:  Vue が価格カレンダー効果を実現

推薦する

MySQLのワークベンチ例の詳細な説明

MySQL Workbench - モデリングおよび設計ツール1. モデルは、最も効果的で高性能なデ...

docker コンペ応募でよく使われるコマンドのまとめ

アカウントにログイン DOCKER_REGISTRY=registry.cn-hangzhou.al...

Centos7 で Java8 と MySQL をインストールしてデプロイする

通常、Java の学習とプロジェクトのデプロイはローカルで行われますが、実稼働環境は Linux 環...

Dockerのヘルス検出メカニズム

コンテナの場合、最も単純なヘルスチェックはプロセス レベルのヘルスチェックであり、プロセスが稼働して...

MySQL のユーザー権限を照会する方法の概要

MySQLユーザー権限を表示する2つの方法を紹介します1. MySQL grantsコマンドを使用す...

ウェブデザインの初心者に役立つ学習教材をいくつかお勧めします

勉強中に読んだ本についてもよく聞かれます。以下は初心者におすすめの本です(私が勉強中に読んだ本です。...

mysql8.0.20 のダウンロードとインストールおよび発生した問題 (図とテキスト)

1.ブラウザでmysqlを検索してダウンロードしてインストールしますアドレス: https://d...

効率を向上できる Linux コマンドエイリアス 10 個のまとめ

序文Linux 環境で作業するエンジニアは、これらの面倒な命令とパラメータのコマンドラインにきっと驚...

MySQL の複合インデックスはどのように機能しますか?

目次背景複合インデックスを理解する左端一致原則フィールド順序の影響複合インデックスは単一のインデック...

DockerコンテナがSongtiなどのフォントを認識しない場合の解決策

問題の背景: docker を使用してプロジェクトをデプロイする場合、プロジェクト内で印刷コントロー...

jQuery プロジェクトで重複送信を防ぐ方法

新しいプロジェクトでは、axios によって重複した送信を防ぐことができますが、古いプロジェクト (...

Ubuntu 20.04 ファイアウォール設定の簡単なチュートリアル (初心者)

序文ますます便利になった今日のインターネット社会では、さまざまなインターネット ランサムウェア ウイ...

DockerでのinfluxDB分散時系列データベースのインストールと関連操作について簡単に説明します。

influxDB の紹介influxDB は分散型時系列データベースです。 cAdvisor はリ...

React Nativeプロジェクトフレームワークの構築経験

React Native は、2015 年 4 月に Facebook によってオープンソース化され...

vmware workstation12 インストール CentOS プロンプト VMware Player と Device/Credential Guard に互換性がない、理由と解決策

最新バージョンの WIN10 では、Microsoft は仮想化コンテナに基づくセキュリティ メカニ...