我有以下情况。我使用嵌套集模型来存储分层数据。该模型几乎完全相同,除了我还想添加具有特定子类别的选项以仅对某个客户端可用。编辑表格将从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|
+-------------+----------------------+-----+-----+---------+---------+
我更愿意选择第一个选项,因为它不需要添加/删除字段。我怀疑执行查询的速度会慢一些,但我并不打算让表格变得非常冗长。您认为哪种方法更合适?
答案 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);