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

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

我更喜欢第一个选项,因为它不需要添加/删除字段。我怀疑执行查询会更慢,但是我不打算使表变得很长。您认为哪种方法更合适?

最佳答案

第一个选项意味着在一个可能非常大的字符串中查找匹配的 ID(并最终限制可以看到该类别的客户端数量)。如果你必须这样做(我建议不要这样做),那么用逗号分隔列表,因为你至少可以使用 FIND_IN_SET() 函数。

第二个选项似乎需要每个客户一列,当您获得更多客户时,这将是一场噩梦。

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

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

关于mysql - 具有特定于客户端的节点的嵌套集模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38182532/

相关文章:

java - 如何在python中返回包含sqlalchemy中的对象的列表,类似于java中的List<OrderInfo>

MySQL group by 为一列提供了错误的数据?

mysql - 当您认识 parent 时如何搜索特定的 child ?

sql - 提高改进的前序树遍历算法的可扩展性

mysql - 单个 MySql 查询即可获取喜欢我喜欢的帖子的用户列表

mysql - 如果条件匹配但有后备,如何获取 mysql 查询

php - 使用 jQuery 获取日期并使用 PHP 表单将其保存到 MySQL

mysql - Django Google App Engine 服务器错误 500

mysql - 如何查找具有相似字符串(正则表达式)的记录?

php - 层级评论系统php