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

时间:2016-07-04 10:31:47

标签: mysql mariadb nested-sets

我有以下情况。我使用嵌套集模型来存储分层数据。该模型几乎完全相同,除了我还想添加具有特定子类别的选项以仅对某个客户端可用。编辑表格将从VB.NET应用程序外部完成,然后将新表格发送回数据库。

我想到了两种不同的选择来实现这一目标。第一个是添加一个新的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来启用/禁用类别。

+-------------+----------------------+-----+-----+---------+---------+
| 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|
+-------------+----------------------+-----+-----+---------+---------+

我更愿意选择第一个选项,因为它不需要添加/删除字段。我怀疑执行查询的速度会慢一些,但我并不打算让表格变得非常冗长。您认为哪种方法更合适?

1 个答案:

答案 0 :(得分:0)

第一个选项意味着在可能非常大的字符串中查找匹配的ID(并最终限制可以看到该类别的客户端数量)。如果你必须这样做(我会反对它),然后将列表逗号分开,然后至少使用FIND_IN_SET()函数。

第二个选项似乎需要每个客户一个列,这将是一个噩梦,因为你有更多的客户。

我建议你有另一个表,每个类别有多行,每个客户一个可以看到该类别。使用简单的连接,您可以检查相关客户端是否可以看到某个类别。

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