正确的表设计 - 如何创建子表

时间:2013-07-09 20:43:54

标签: sql-server database-design database-connection

我不确定这是否是正确的论坛 - 它更多的是关于设计sql表 我试图在网上找到答案 - 没有运气

我有列出的菜单权限表

  • permissionID - 序号
  • 用户ID
  • menuID - 用户有权访问的菜单的ID

一旦用户进入菜单 - 它可能会有一些进一步的限制,例如可能会有城市名称下拉,用户只能访问其中一些(或全部)。

为了实现这一点,我创建了另一个名为let的菜单权限子表。 它有......

  • permissionID
  • permissionChildID
  • permissionOption

现在...

  • 如果用户有权查看所有城市 - 我将permissionOption设置为-1
  • 如果用户拥有某些城市的权限 - 我会在每个城市的子表中创建单独的条目

查询...

SELECT CityID, CityName
FROM Location
WHERE (CityID IN (
  SELECT permission_option 
  FROM PermissionMenuChild 
  WHERE userID = 1)) 

它有效 - 但有人可以用更优雅的方式来做吗?

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)。 将第一个子项添加到菜单后,具有该菜单权限的所有现有用户都将拥有该权限。

总的来说,我喜欢你到目前为止所做的一切。