具有客户端特定节点的嵌套集模型
Nested set model with client-specific nodes
我有以下案例。我正在使用嵌套集模型来存储分层数据。这个模型几乎是一样的,除了我还想添加一个选项,让一个特定的子类别只对特定的客户可用。编辑 table 将在 VB.NET 应用程序外部完成,然后将新的 table 发送回数据库。
我想到了两种不同的选择来实现这一目标。第一个是添加一个新的 client_id 字段,用于连接客户端 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|
+-------------+----------------------+-----+-----+---------+
第二个选项是为每个客户添加一个新字段并使用某种标记,例如 1/0 到 enable/disable 类别。
+-------------+----------------------+-----+-----+---------+---------+
| 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|
+-------------+----------------------+-----+-----+---------+---------+
我更愿意选择第一个选项,因为它不需要 adding/removing 字段。我怀疑执行查询会更慢,但我不打算让 table 变得很长。你觉得哪种方式更合适?
第一个选项意味着在可能非常大的字符串中找到匹配的 ID(并最终限制可以看到该类别的客户数量)。如果您必须这样做(我建议您不要这样做),那么请尽可能使用逗号分隔列表,然后至少使用 FIND_IN_SET() 函数。
第二个选项似乎需要每个客户一个列,当您获得更多客户时,这将是一场噩梦。
我建议您使用另一个 table,其中每个类别有多行,每个类别对应每个可以看到该类别的客户。使用简单的联接,您可以检查相关客户端是否可以看到某个类别。
编辑 - 2 table 解决方案意味着添加一个 table 链接类别到客户端。像这样简单的 table:-
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);
我有以下案例。我正在使用嵌套集模型来存储分层数据。这个模型几乎是一样的,除了我还想添加一个选项,让一个特定的子类别只对特定的客户可用。编辑 table 将在 VB.NET 应用程序外部完成,然后将新的 table 发送回数据库。
我想到了两种不同的选择来实现这一目标。第一个是添加一个新的 client_id 字段,用于连接客户端 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|
+-------------+----------------------+-----+-----+---------+
第二个选项是为每个客户添加一个新字段并使用某种标记,例如 1/0 到 enable/disable 类别。
+-------------+----------------------+-----+-----+---------+---------+
| 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|
+-------------+----------------------+-----+-----+---------+---------+
我更愿意选择第一个选项,因为它不需要 adding/removing 字段。我怀疑执行查询会更慢,但我不打算让 table 变得很长。你觉得哪种方式更合适?
第一个选项意味着在可能非常大的字符串中找到匹配的 ID(并最终限制可以看到该类别的客户数量)。如果您必须这样做(我建议您不要这样做),那么请尽可能使用逗号分隔列表,然后至少使用 FIND_IN_SET() 函数。
第二个选项似乎需要每个客户一个列,当您获得更多客户时,这将是一场噩梦。
我建议您使用另一个 table,其中每个类别有多行,每个类别对应每个可以看到该类别的客户。使用简单的联接,您可以检查相关客户端是否可以看到某个类别。
编辑 - 2 table 解决方案意味着添加一个 table 链接类别到客户端。像这样简单的 table:-
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);