mySQL Schema设计建议

时间:2013-07-11 14:40:29

标签: mysql schema

问题:我如何使用下面的架构获取未签署文档的用户列表,如果他们有文档中包含的角色?

背景

我有一个用户表。用户有角色。这是一个简单的设置:

Role table:           Role_ID | Name
User table:           User_ID | Name
Users_Roles table:    User_ID | Role_ID

现在我需要添加一个Documents表:

Documents table:  Document_ID | Name

我需要知道用户何时签署了文档:

Documents_Users table: User_ID | Document_ID

到目前为止它很简单。

但现在变得很难 - 我需要对文档添加限制,因此我可以将文档分配给多个角色:

即。 Document_ID 1用于Role_ID(3,4,5)。

我猜我需要做

Documents_Roles table: Role_ID | Document_ID

但是 - 这是我不知道的难点:我如何使用上面的模式获取没有在文档上签名的用户列表,如果他们有一个文档中包含的角色?

1 个答案:

答案 0 :(得分:1)

Your structure is correct

SELECT Users_Roles.User_ID, Documents_Roles.Document_ID
FROM Documents_Roles -- get some documents
-- JOIN Documents ON (Documents.Document_ID = Documents_Roles.Document_ID) -- if you need details from the Documents table
JOIN Users_Roles USING (Role_ID) -- get all users expected to sign them
-- JOIN Users ON (Users.User_ID = Users_Roles.User_ID) -- if you need details from the Users table
LEFT JOIN Documents_Users ON
    Documents_Users.Document_ID = Documents_Roles.Document_ID AND
    Documents_Users.User_ID = Users_Roles.User_ID -- find whether they have signed it
WHERE
    Documents_Users.User_ID IS NULL -- only those expected users who have *not* signed it
    -- AND Documents_Roles.Document_ID = some_id
;