【问题标题】:Nested set model with client-specific nodes具有客户端特定节点的嵌套集模型
【发布时间】:2016-07-04 10:31:46
【问题描述】:

我有以下情况。我正在使用嵌套集模型来存储分层数据。除了我还想添加让特定子类别仅对特定客户可用的选项之外,该模型几乎相同。编辑表将在 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|
+-------------+----------------------+-----+-----+---------+---------+

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

【问题讨论】:

  • 两者都不要。使用 lft,rgt 邻接列表。 csv会很荒谬。第二个将是职业终结者。
  • 我已经在使用 lft,rgt。
  • 不要在顶部块最后一列中使用 csv。

标签: mysql mariadb nested-sets


【解决方案1】:

第一个选项意味着在一个可能非常大的字符串中找到匹配的 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);

【讨论】:

  • 您好,能详细说明一下吗?
  • @StanislavLazarov - 添加了建议的第二张桌子
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
相关资源
最近更新 更多