具有客户端特定节点的嵌套集模型

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);