Database design [对象]-[角色]-[用户]关系的数据库设计建议,以及两种方法的潜在性能影响

Database design [对象]-[角色]-[用户]关系的数据库设计建议,以及两种方法的潜在性能影响,database-design,Database Design,想在我的团队最近继承的应用程序上获得一些社区意见。总的来说,应用程序有很多选择性能问题—我现在要重点关注的主要问题是一个表,该表包含大约20列,代表该表中特定行的不同角色(管理员、参与者1、参与者2、常规联系人等)。表中的每一行表示一个对象,[role]列指示哪个用户具有该对象的角色。每个角色列都与[user]表有外键关系 当应用程序需要显示与此表的角色相关的用户信息时,SELECT语句必须加入[user]表20次,每列一次 SELECT role1.user_name, role2.user_

想在我的团队最近继承的应用程序上获得一些社区意见。总的来说,应用程序有很多选择性能问题—我现在要重点关注的主要问题是一个表,该表包含大约20列,代表该表中特定行的不同角色(管理员、参与者1、参与者2、常规联系人等)。表中的每一行表示一个对象,[role]列指示哪个用户具有该对象的角色。每个角色列都与[user]表有外键关系

当应用程序需要显示与此表的角色相关的用户信息时,SELECT语句必须加入[user]表20次,每列一次

SELECT role1.user_name, role2.user_name, role3.user_name, ...
FROM [object] AS o
LEFT JOIN [user] AS role1 ON o.role_1_user_id = role1.id
LEFT JOIN [user] AS role2 ON o.role_2_user_id = role2.id
LEFT JOIN [user] AS role3 ON o.role_3_user_id = role3.id
...
我的直觉告诉我,重新设计表以删除角色列,并添加包含object\u id、role\u id和user\u id列的联接表,可能会获得更好的性能。我可能需要以类似的格式查看数据,但我认为在其他情况下总体性能会更好


希望听到关于设计选项的建议,以及我可能缺少的任何其他方法。

这是一个多列属性反模式。你的思路是正确的。实际上,链接表在这里是合适的。再想一想,链接表方法的另一个好处是,我们可以在数据库中强制执行唯一的约束(用户只能为一个对象分配一个角色等),这是我们目前无法使用数据库强制执行的。