权限数据库设计问题
我要设计一个数据库要求:
用户至少要有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个词:
不可分,关联,非关联
或者
原子,依赖,不依赖
------解决方案-----------