在数据库中保存三级权限

时间:2014-09-20 18:22:56

标签: php mysql database-design permissions authorization

在涉及2个以上级别的数据库中存储权限的最佳方法是什么?目前只有2级权限,它们存储在桥接实体表中,如下所示:

UID | Buildings | Floor
------------------------
 1  |  A, B, C  |  F9

还有另一个名为Exceptions的表具有相同的结构,表明用户不应该拥有这些权限:

UID | Buildings | Floor
------------------------
 1  |    null   |  C4

因此,在上面的示例中,用户1将拥有建筑物F中第9层的权限,建筑物A,B和C中的所有房间,但不包括C中的第4层。

新要求是在楼层上添加更细粒度的权限级别。所以代码看起来像A1A,A1B等。建筑物和房间总是按字母顺序排列,楼层号码总是数字。 我无法更改这些代码的格式,因为它们来自外部来源。

处理这种情况的最佳方法是什么?我知道Linux处理组和用户使用位字符串的文件权限,但在我的情况下有数千个房间听起来不可行,而且用户/组事情只有两个级别。

我考虑过只添加一个名为Rooms的新列并继续使用以逗号分隔的字符串,但有更好的方法吗?如果重要,我会使用MySQL。

1 个答案:

答案 0 :(得分:0)

如果我必须实现这个,我会使用一个包含三列的表 - uid,type和element。 Uid引用用户,键入(建筑物,楼层,房间)和元素建筑物或地板或房间的代码。 我通常会为每个访问元素为每个人插入一行。

如果我确定元素的格式遵循严格的模式,我也可以变得更加大胆。例如

建筑物的代码只有字母

楼层的代码如letter.number

客房的代码如letter.number.letter

在上述情况下,您只能使用一个表与列uid和元素,因为从数据的格式中您可以提取元素的类型(如果它是建筑物,楼层或房间)。您还可以使用通配符进一步存储访问权限:

进入C楼的所有楼层和房间:C *

进入B楼6楼的所有房间:B6 *

甚至

访问所有楼层和建筑物中的所有C房间:** C

进入所有二楼:* 2 *

希望有所帮助