将字符串映射到关系

Jazerix

我正在创建一个可以将任务分配给不同用户的系统。问题在于,任务是通过称为接收者的字符串列映射的,该列最后映射到用户的集合。该列的内容可能如下所示:

  • has:tasks-update,tasks-access-具有tasks-updatetasks-access权限的用户
  • role:administrator -具有管理员角色的用户。

现在,我正在解决问题。当我必须弄清楚谁有权访问特定任务时,这有点容易,但是当用户需要知道将哪些任务“分配”给了他们时,这很麻烦。现在,我正在解析每个收件人列,以查看是否包含该用户,但是不幸的是,这并不可行,因为它会带来巨大的性能成本。

我已经在适当的列上添加了索引,以加快查找速度。

一种解决方案是,当收件人更改时,我将解析收件人,然后将用户和任务之间的关系放在中间表中。虽然这可以让我快速查找分配给用户的任务,但是这也变得很麻烦,因为现在我需要跟踪(例如)每次给用户授予管理员角色并将其同步到中间表。

我希望能够在不牺牲性能的情况下获得解决此问题的一些见解,而不必像现在这样,但也不必一直保持同步。

阿尔特

将任何内容的列表以字符串形式存储在单数列中可能会导致各种问题

正如您已经遇到的..对列表的任何关系查找,插入,更新或删除操作都将首先需要对现有列表进行某种形式的解析

值得注意的是,该列上的任何索引都可能不会被引擎用于这些任务,因为基于字符串的列(FULL TEXT除外)上的索引仅在搜索字符串开头时才真正有用

例如,

SELECT * 
  FROM site_user 
 WHERE recipients LIKE '%tasks-update%'

将无法使用收件人列上的索引


一条建议

我会将您当前的列表拆分成新表,例如

  1. role -ID,名称,…
    • 例如{3,'administrator',...}
  2. permission -ID,名称,…
    • 例如{5,'任务访问',...}
    • 例如{9,'任务更新',...}
  3. site_user -ID,名称,role_id,...
    • 例如{7,'Jeff',3,...}
  4. site_user_permission -id,site_user_id,permission_id等。
    • 例如{1,7,5,...}
    • 例如{2,7,9,...}

在示例记录中,“杰夫”是“管理员”,并已分配了“任务更新”和“任务访问”权限

使用JOIN可以轻松实现查找,并且在添加或删除数据时保持一致。可以通过添加适当的外键和唯一索引来维护数据完整性


注意:如果没有引起您问题的特定操作示例,或者没有有关您打算如何使用用户角色和权限的更多详细信息,那么除了提出一般性建议外,要做的事情还很难

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章