2

我目前正在创建一个应用程序,用户可以在其中从网站控制我的世界服务器(这将与他们安装在服务器上的插件进行交互)。我试图想出一个合适的设计来允许每个服务器定义自己的用户权限组。最后,将有一个预定义的选项列表(我的插件将知道如何处理的东西)供每个服务器从中挑选并分配给他们创建的组。我的目标是拥有它,因此该网站上的 1 个单个用户可能能够在一个服务器面板中拥有多个组,并且该用户能够被分配到多个服务器面板。

这是我目前想出的数据库布局:

Table: Roles     (will hold the predefined roles)
  Columns:
    serverTypeId (to distinguish between roles allowed for the 2 versions of minecraft)
    roleId       (the role's unique id, primary key)
    roleName     (some name to distinguish the role's purpose)

Table: ServerGroup (will hold the custom per server groups)
  Columns:
    serverId         (the server's unique id)
    groupId    (the server role's unique id, primary key)
    groupName  (name given to group, like Staff, Admin, etc)
    roleList         (a csv list of roleId's from the Roles table)

Table: ServerPermissions
  Columns:
    serverId       (the server's unique id)
    serverGroupId  (the server's groupId that this user belongs to)
    userId         (the user's id that is unique to the whole website)

有一个更好的方法吗?这是我能想到的最好的方法。我不是最精通 SQL 并且正在寻找改进的方法。

4

1 回答 1

1

这看起来是一个相当可靠的设计,但有一个警告。ServerGroup 表中的 roleList 列称为列内的重复组,应避免使用。与其将所有角色 ID 塞进一列,不如将其拆分为一个单独的表,该表将充当角色和 ServerGroup 之间的连接点。

Table: ServerGroupRoles (will list roles for each ServerGroup)
  Columns:
    groupID (foreign key to ServerGroup)
    roleID (foreign key to Roles)
  Primary Key: groupID, roleID

对于 ServerGroup 拥有的每个角色,ServerGroupRoles 中都会有一条记录。这种重复组的方法的好处是易于搜索和维护。用于检查服务器组是否存在特定角色的查询可能是使用相等性查找索引,而不是使用 LIKE 扫描索引。在维护方面,从 ServerGroup 中删除角色是一个简单的 DELETE/WHERE 语句,而不是不必要的昂贵的字符串操作。

如果您的 Web 应用程序要求将权限作为 CSV 字符串处理,那么从针对 ServerGroupRoles 的查询构建字符串将是微不足道的。但是,如果应用程序发生变化,您将不会被重复组造成的低效率所困扰。

于 2012-05-17T14:18:09.100 回答