将字符串映射到关系

时间:2019-06-23 13:04:37

标签: mysql database database-design rdbms

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

例如

role

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


建议

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

  1. permission-ID,名称...
    • 例如 {3,'administrator',...}
  2. site_user-ID,名称...
    • 例如 {5,'任务访问',...}
    • 例如 {9,'任务更新',...}
  3. site_user_permission-ID,名称,role_id等
    • 例如 {7,'Jeff',3,...}
  4. <activity android:name=".activity.MapsActivity" android:label="@string/title_activity_maps"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="me" android:host="test" /> </intent-filter> </activity> -ID,site_user_id,permission_id等
    • 例如 {1,7,5,...}
    • 例如 {2,7,9,...}

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

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


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

答案 1 :(得分:0)

符合normal forms的经过尝试且良好的方法是拥有task_type和角色表。当然,您有一个用户表,并且由于用户可以具有许多角色和特权,因此您将需要一个user_role和user_privilege表来处理多对多关系。解决问题的一种简单方法是使用一些数字来表示某些特权和角色,例如1表示管理员,2表示3、5、7、11、13、17等,以表示其他特权。为角色指定相似的数字作为主键可以缓解角色匹配问题。例如,让我们考虑一下您拥有代码7的特权的情况。如果搜索具有可被该代码整除的ID的角色,那么您将获得7(例如data_read)和1(管理员)。

答案 2 :(得分:0)

您需要确定用户和任务之间的关系表,当然,在此关系中,您还必须标记用户是否为管理员。这是设计应用程序结构的最佳方法,而不是将信息合并到单个列中,这会导致性能/复杂性问题。继续使用这种方法,您的工作将从中受益。