我不确定这是否是正确的论坛 - 它更多的是关于设计sql表 我试图在网上找到答案 - 没有运气
我有列出的菜单权限表
一旦用户进入菜单 - 它可能会有一些进一步的限制,例如可能会有城市名称下拉,用户只能访问其中一些(或全部)。
为了实现这一点,我创建了另一个名为let的菜单权限子表。 它有......
现在...
查询...
SELECT CityID, CityName
FROM Location
WHERE (CityID IN (
SELECT permission_option
FROM PermissionMenuChild
WHERE userID = 1))
它有效 - 但有人可以用更优雅的方式来做吗?
答案 0 :(得分:0)
看起来你有两张桌子:
CREATE TABLE Permissions (
permissionID int identity(1,1),
userID int,
menuID int);
CREATE TABLE PermissionChildren (
permissionChildID int identity(1,1),
permissionID int,
permissionOption int);
假设用户123有权查看菜单234中的所有城市,那么您将拥有以下内容:
INSERT INTO Permissions (userID, menuID) VALUES (123, 234);
INSERT INTO PermissionChildren (permissionID, permissionOption) VALUES (@@identity, -1);
假设用户456只允许在菜单234中浏览几个城市,那么您将拥有以下内容:
INSERT INTO Permissions (userID, menuID) VALUES (456, 234);
DECLARE @permissionID int = @@identity;
INSERT INTO PermissionChildren (permissionID, permissionOption) VALUES (@permissionID, 11);
INSERT INTO PermissionChildren (permissionID, permissionOption) VALUES (@permissionID, 22);
INSERT INTO PermissionChildren (permissionID, permissionOption) VALUES (@permissionID, 44);
我将在这里做一些假设:
我喜欢你的架构。你肯定需要Permissions
。这将支持您没有孩子的菜单。
PermissionChildren
也是支持多个子权限所必需的。我认为你不需要permissionChildID
。
无论如何,SQL Server将为您创建一个唯一的ID。但是如果你的约定就是在每张桌子上都有ID,那也不会太可怕。
我不喜欢-1
的{{1}}部分。我认为在permissionOption
中没有相应的行应该意味着用户拥有所有孩子的所有权限。
原因是当菜单没有任何子权限时,它不应该在PermissionChildren
中有任何行。
此配置意味着对该菜单具有权限的每个用户也具有对所有子项的权限(全部为0)。
将第一个子项添加到菜单后,具有该菜单权限的所有现有用户都将拥有该权限。
总的来说,我喜欢你到目前为止所做的一切。