以下の内容では、隣接リストを使用してツリー構造を保存する MYSQL のプロセスとソリューションを紹介し、保存された図を分析します。 今日は、もっと厄介な問題、つまりツリー構造をデータベースに保存する方法を見てみましょう。 MySQL のようなリレーショナル データベースは、テーブルのようなフラットなデータを保存するのに適していますが、ツリー構造のような深いデータに遭遇すると制御が難しくなります。 たとえば、会社の人員構成を保存する必要があります。一般的な階層構造は次のとおりです。 (絵を描くのは簡単ではありません。) では、この構造をどのように保存するのでしょうか?そして、次の情報を取得します。 1. Xiaotian の直属の上司が誰であるかを調べます。 2. Lao Song の管理下にある直接従業員を確認します。 3. Xiaotianの上司全員を確認します。 4. Lao Wang によって管理されているすべての従業員を照会します。 解決策 1: (隣接リスト) は、現在のノードの親ノード情報のみを保存します。 従業員テーブルを作成する( 記録された情報は単純で粗いので、次の構造情報を保存します。 さて、それでは答えの部分に入りましょう。 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 驚くべき結果をご覧ください: 私はそれを理解しましたが、正直に言うと、それは簡単ではありませんでした。 。 。 この方法の利点は、保存する情報が少なく、直属の上司と直属の部下を確認するのに非常に便利なことです。欠点は、複数レベルのクエリを実行するのが非常に難しいことです。したがって、直接の上司と部下の関係のみを使用する必要がある場合、この方法は依然として適切な選択であり、多くのスペースを節約できます。その他のストレージソリューションについては後ほど紹介します。良いものと悪いものの絶対的な区別はなく、単にさまざまな状況に適しているだけです。 以下もご興味があるかもしれません:
|
<<: Linux でユーザーをグループに追加する 4 つの方法の概要
序文vsftp は使いやすく安全な FTP サーバー ソフトウェアです。システムユーザーまたは仮想ユ...
目次1. データベースとは何ですか? 2. データベースの分類は? 3. データベースとデータ構造の...
本日、開発中に、顧客からページをキャッシュしないように要求される方法に遭遇しました。調べたところ、ペ...
この記事では、ドラッグ可能なプログレスバーを実装するためのJavaScriptの具体的なコードを参考...
目次MVCCとはMVCC 実装MVCC はファントム リードを解決しますか? MVCCとはMVCC ...
この記事では、Vueの具体的なコードを共有して、簡単なショッピングカートを実装します。具体的な内容は...
質問docker run コマンドを使用して、tomcat コンテナが正常に追加されました。ポートも...
目次1. カスタム指示とは何ですか? 2. 指示をカスタマイズする方法フック機能3. 応用シナリオ入...
ウェブサイトのモバイル版には、少なくともいくつかの基本機能が必要です。 1. ページの適用性の問題:...
1. 動的パラメータ2.6.0 以降では、角括弧で囲まれた JavaScript 式をディレクティブ...
ステップ1: 現在のカーネルを表示する 読み取る $ uname -a Linux rew 4.15...
<meta http-equiv="x-ua-compatible" コン...
背景まず最初に、私はフロントエンド開発の専門家ではないことを述べておきたいと思います。私の以前のコン...
最初で最も重要なステップは、Windows 環境に Ngnix サービスをインストールする方法です。...
コードを画像に変換するにはhtml2canvas は、ブラウザから Web ページのスクリーンショッ...