日期:2014-05-17  浏览次数:20531 次

权限数据库设计问题
我要设计一个数据库要求:
用户至少要有5种,对每个设备的操作有20种,设备至少要有15个。后期还有可能添加设备或是每个设备的操作,或是用户种类

我设计如下:
用户表
User_id     User_name    User_(其他属性,如邮箱,地址,联系方式等等)
1           User1           张三@qq.com
2           User2           李四@qq.com
...

设备表
Equip_id   Equip_name   Equip_description
1          Equip1       用于监视的设备
2          Equip2       用于操作的设备
...
权限表
Right_id   Right_name   Right_description
1          a            操作1
2          b            操作2
...

用户设备权限表
ID         User_name    Equip_name       Right
1          User1        Equip1           abc(即拥有a,b,c三种权限)
2          User1        Equip2           ab
3          User2        Equip1           a
4          User2        Equip2           b
...

感觉最后一个表会很复杂。不知道遇到这种情况的话要怎么做呢。。。期待~~




------解决方案--------------------
最后一个表不是复杂的问题,是违背了设计泛式1NF,第一原则:原子不可分性。
多对多的关系,需要一个中间表,防止出现需要拆分字符串abc这种现象。
还有,外键一定要用数字Id,不要User_name  ,Equip_name 这样使用varchar类型做关联,因为会产生歧义,可能同时有两个同名的人或设备。
这是数据库设计的第3泛式3NF,唯一关联性(只和主键关联)

所以你最后一个表应该这样设计,前几个表都没问题

用户设备权限表 ,这个表的ID用途不大,主要是3个外键起作用。
ID        User_Id    Equip_Id     RightId 
xx          1           1           1
xx          1           1           2
xx          1           1           3
这样三条记录,就代表abc,即拥有a,b,c三种权限
------解决方案--------------------
做个多对多的表吧

本人设计的一般是用户表,模块表,权限对应表(用户对应表,怎删改查个一列BIT类型,来判断权限)
------解决方案--------------------
顺便,每次设计数据库的时候默念3个泛式:
1NF:原子不可分性,就是每个字段不可以拆分,比如1,2,3或者你的abc这样的设计就违反了。需要把字段拆成多行记录
2NF:主键关联性,每个表所有字段必须依赖于主键。
3NF:只和主键关联性,表和表之间只依靠主键关联,表的其他字段之间不互相依赖。

以上3条,我是用自己的语言整理的,希望你也用自己的话来整理。
我一般浓缩成3个词:
不可分,关联,非关联
或者
原子,依赖,不依赖
------解决方案-----------