有时候,复杂的业务需求中,为了获取一些额外信息,需要去 join 很多表,比如一个经典的 user role permission 的 5 表设计: user user_role role role_permission permission
如果想要获取某个 User 的所有权限,可以借助以下 SQL:
SELECT u.id, u.username, r.name, p.name FROM user u
INNER JOIN user_role ur ON ur.user_id = u.id
INNER JOIN role r ON r.id = ur.role_id
INNER JOIN role_permission rp ON rp.role_id = r.id
INNER JOIN permission p ON rp.permission_id = p.id;
采用 ActiveRecord 定义时需要加入很多额外的 association,极大地提升了业务复杂度。
如果能创建一个 view,建立从 user -> permission 的关系:
CREATE VIEW user_permission AS SELECT u.id uid, r.id rid, p.id pid, u.username username, r.name rname, p.name pname FROM user u
INNER JOIN user_role ur ON ur.user_id = u.id
INNER JOIN role r ON r.id = ur.role_id
INNER JOIN role_permission rp ON rp.role_id = r.id
INNER JOIN permission p ON rp.permission_id = p.id;
只需要定义一个 UserPermission 就能查询相应的 view 了:
class UserPermission < ActiveRecord::Base; end
目前看到这种方案是可以降低业务代码的复杂度的,但是否会对性能造成影响呢?