2016-07-04 19 views
0

私は次のような場合があります。私は、階層データを格納するためにネストされたセットモデルを使用しています。このモデルは、特定のサブカテゴリを特定のクライアントにのみ使用できるようにするオプションを追加したいという点を除いて、ほとんど同じです。テーブルの編集はVB.NETアプリケーションから外部的に行い、新しいテーブルをデータベースに送り返します。クライアント固有のノードを含む入れ子セットモデル

私はそれを達成するために2つの異なる選択肢を考えました。最初に、クライアントIDを連結する新しいclient_idフィールドを追加します。次に、文字列内の特定の番号を探すためのクエリを実行します。 #1はすべてのユーザーを指しますが、それとは異なる番号は特定のクライアントを指します。

+-------------+----------------------+-----+-----+---------+ 
| category_id | name     | lft | rgt |client_id| 
+-------------+----------------------+-----+-----+---------- 
|   1 | MAINCAT1    | 1 | 20 |  1| 
|   2 | subcat1    | 2 | 9 |  2;4| 
|   3 | subcat2    | 3 | 4 |  3| 
|   4 | subcat3    | 5 | 6 |  1| 
|   5 | subcat4    | 7 | 8 |  2;3| 
|   6 | MAINCAT2    | 10 | 19 |  1| 
|   7 | subcat1    | 11 | 14 |  1| 
|   8 | subcat2    | 12 | 13 |  1| 
|   9 | subcat3    | 15 | 16 |  3;4| 
|   10 | subcat4    | 17 | 18 |  3;4| 
+-------------+----------------------+-----+-----+---------+ 

2番目のオプションは、すべてのクライアントに新しいフィールドを追加し、カテゴリを有効/無効にするために何らかのマーク(1/0など)を使用することです。

+-------------+----------------------+-----+-----+---------+---------+ 
| category_id | name     | lft | rgt |client_2 |client_3 
+-------------+----------------------+-----+-----+---------+---------+ 
|   1 | MAINCAT1    | 1 | 20 |  1|  1| 
|   2 | subcat1    | 2 | 9 |  0|  1| 
|   3 | subcat2    | 3 | 4 |  0|  1| 
|   4 | subcat3    | 5 | 6 |  1|  0| 
|   5 | subcat4    | 7 | 8 |  1|  0| 
|   6 | MAINCAT2    | 10 | 19 |  1|  1| 
|   7 | subcat1    | 11 | 14 |  0|  1| 
|   8 | subcat2    | 12 | 13 |  0|  1| 
|   9 | subcat3    | 15 | 16 |  1|  0| 
|   10 | subcat4    | 17 | 18 |  0|  1| 
+-------------+----------------------+-----+-----+---------+---------+ 

フィールドを追加/削除する必要がないため、最初のオプションを使用することをお勧めします。私はクエリの実行が遅くなると思っていますが、テーブルを非常に長くする予定はありません。どの方法がより適切だと思いますか?

+0

どちらでもない。 lft、rgtの隣接リストを使用してください。 CSVはばかばかしいでしょう。 2番目はキャリア入門者です。 – Drew

+0

私は既にlft、rgtを使用しています。 –

+0

最後の列では、先頭のチャンクにcsvを挿入しないでください。 – Drew

答えて

0

最初のオプションは、潜在的に非常に大きな文字列で一致するIDを見つけること(そして、最終的にはそのカテゴリを見ることができるクライアントの数を制限すること)を意味します。これを行う必要がある場合(そして私はそれに対して助言します)、少なくともFIND_IN_SET()関数を使用できるようにリストをカンマ区切りにします。

2番目のオプションは、クライアントごとに1つの列を必要とするように思われます。これは、クライアントが増えるにつれて悪夢となります。

カテゴリごとに複数の行があり、そのカテゴリを見ることができるクライアントごとに1つのテーブルがあることをお勧めします。単純な結合を使用すると、関連するクライアントがカテゴリを参照できることを確認できます。

EDIT-2テーブルソリューションは、カテゴリをクライアントにリンクするテーブルを追加することを意味します。このようなシンプルな表: -

CREATE TABLE category_client 
(
    category_id INT(11), 
    client_id INT(11), 
    PRIMARY KEY (`category_id`, `client_id`), 
    KEY `client_id` (`client_id`) 
); 

INSERT INTO TABLE category_client (client_id, category_id) VALUES 
(1, 1, 
(2, 2), 
(2, 4), 
(3, 3), 
(4, 1), 
(5, 2), 
(5, 3), 
(6, 1), 
(7, 1), 
(8, 1), 
(9, 3), 
(9, 4), 
(10, 3), 
(10, 4); 
+0

こんにちは、詳しく教えてください。 –

+0

@StanislavLazarov - 提案された第2表を追加 – Kickstart

+0

この度はありがとうございます。それは完全に動作します! –