首页数据库数据库用户表设计,数据库设计用户表

数据库用户表设计,数据库设计用户表

编程之家2023-10-1886次浏览

大家好,今天小编来为大家解答以下的问题,关于数据库用户表设计,数据库设计用户表这个很多人还不知道,现在让我们一起来看看吧!

数据库用户表设计,数据库设计用户表

用户,权限,角色表怎么设计

MSSQL的库

设计表:

Users用户表字段:userid,username,userpermission

Roles角色表字段:roleid,rolename,rolepermission

UserInRole用户角色对应表字段:userid,roleid

PermissionList权限列表字段:permissionid,permissionDescription,permissionGroup

数据库用户表设计,数据库设计用户表

权限设计:许可、禁止和未设置三种状态,Allow,Deny,Not Set

目标:

实现用户权限的定义。

首先定义角色权限,用户与角色间是多对多的关系。用户权限继承自角色权限。

情况一:用户所属的多个角色存在权限冲突时,取最小权限,即某权限角色A许可,角色B禁止,则该权限为禁止。

情况二:用户所属的角色均未对某权限进行设置时,即NotSet状态,则该权限同DENY

数据库用户表设计,数据库设计用户表

情况三:用户所属的角色对某权限为许可时,也可单独设置该权限为禁止。

功能:

设置用户权限:

默认情况下,用户权限继承自所属角色的权限

可单独设置某用户的权限

扩展权限

权限定义可随时增加,并可以分组。当增加权限时,默认的角色权限均为未设置状态

问题:

1、在MSSQL数据库中如何设置userpermission和rolepermission字段的字段类型?

2、如何存取用户权限?特别是当用户属于多个角色时,如何高效的设置用户权限的问题

网站专用制作,价格绝对优惠,不做网站也可以交流一下经验……

要做网站的加我122216605/541597237。

绝对让你的网站给浏览者最COOL的冲击……

在数据库中如何设计权限表(给数据库用户创建表的权限)

我做过类似有权限管理的系统,表分3个:

第一个表是权限表(tb_pope),都有什么权限,以你的系统要求,分3个权限:管理所有学生,管理系学生,本学生。

表列名可以是:ID,popeName,里面有3条记录。

1,管理所有学生

2,管理系学生

3,本学生

第二个表是用户表(tb_user):ID,userName,age,等等.

第三个表就是用户权限表(tb_userpope):ID,userID,PopeID

登录时先检查是否有该用户名,然后读取其权限值,根据权限操作数据库显示或隐藏操作的部分。

大致就这样了。

数据库设计用户表

1、首先设计一张用户表,有用户信息,方便注册(用户ID,用户姓名,用户性别。。)等一些基本信息;

2、设计一张题目表,字段有题目ID、题目内容

3、设计一张答案表,如果是选择题,设计的字段为答案ID、题目ID、答案选项、选项内容;如果是简答题,设计的字段为答案ID、题目ID、答案内容

4、设计一张用户答题表,设计的字段为ID(自增长列或者随机函数)、用户ID、题目ID、用户答题内容或者选择选项、用户答题时间、用户答题状态(状态表示是否答对,如果是0则是没答对,1则是答对)

5、在用户答题表中,用户答题状态可默认为null,当用户答完题目后点击提交时,就由系统自动批阅,同时查询题目表、答案表、用户答题表查询是否正确答案和用户答案是否一致,如果一直的话就将用户答题表中的用户答题状态更新为1,否则更新为0。

6、记录答题顺序的话,就可根据用户答题表中的用户答题时间来记录排序。

数据库表结构设计,常见的数据库管理系统

一、数据场景 1、表结构简介任何工具类的东西都是为了解决某个场景下的问题,比如Redis缓存系统热点数据,ClickHouse解决海量数据的实时分析,MySQL关系型数据库存储结构化数据。数据的存储则需要设计对应的表结构,清楚的表结构,有助于快速开发业务,和理解系统。表结构的设计通常从下面几个方面考虑:业务场景、设计规范、表结构、字段属性、数据管理。

2、用户场景

例如存储用户基础信息数据,通常都会下面几个相关表结构:用户信息表、单点登录表、状态管理表、支付账户表等。

用户信息表

存储用户三要素相关信息:姓名,手机号,身份证,登录密码,邮箱等。

CREATE TABLE `ms_user_center`( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT'用户ID', `user_name` varchar(20) NOT NULL COMMENT'用户名', `real_name` varchar(20) DEFAULT NULL COMMENT'真实姓名', `pass_word` varchar(32) NOT NULL COMMENT'密码', `phone` varchar(20) NOT NULL COMMENT'手机号', `email` varchar(32) DEFAULT NULL COMMENT'邮箱', `head_url` varchar(100) DEFAULT NULL COMMENT'用户头像URL', `card_id` varchar(32) DEFAULT NULL COMMENT'身份证号', `user_sex` int(1) DEFAULT'1' COMMENT'用户性别:0-女,1-男', `create_time` datetime DEFAULT NULL COMMENT'创建时间', `update_time` datetime DEFAULT NULL COMMENT'更新时间', `state` int(1) DEFAULT'1' COMMENT'是否可用,0-不可用,1-可用', PRIMARY KEY(`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';单点登录表

用意是在多个业务系统中,用户登录一次就可以访问所有相互信任的业务子系统,是聚合业务平台常用的解决方案。

CREATE TABLE `ms_user_sso`( `user_id` int(11) NOT NULL COMMENT'用户ID', `sso_id` varchar(32) NOT NULL COMMENT'单点信息编号ID', `sso_code` varchar(32) NOT NULL COMMENT'单点登录码,唯一核心标识', `log_ip` varchar(32) DEFAULT NULL COMMENT'登录IP地址', `create_time` datetime DEFAULT NULL COMMENT'创建时间', `update_time` datetime DEFAULT NULL COMMENT'更新时间', `state` int(1) DEFAULT'1' COMMENT'是否可用,0-不可用,1-可用', PRIMARY KEY(`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户单点登录表';状态管理表

系统用户在使用时候可能出现多个状态,例如账户冻结、密码锁定等,把状态聚合到一起,可以更加方便的管理和验证。

CREATE TABLE `ms_user_status`( `user_id` int(11) NOT NULL COMMENT'用户ID', `account_status` int(1) DEFAULT'1' COMMENT'账户状态:0-冻结,1-未冻结', `real_name_status` int(1) DEFAULT'0' COMMENT'实名认证状态:0-未实名,1-已实名', `pay_pass_status` int(1) DEFAULT'0' COMMENT'支付密码是否设置:0-未设置,1-设置', `wallet_pass_status` int(1) DEFAULT'0' COMMENT'钱包密码是否设置:0-未设置,1-设置', `wallet_status` int(1) DEFAULT'1' COMMENT'钱包是否冻结:0-冻结,1-未冻结', `email_status` int(1) DEFAULT'0' COMMENT'邮箱状态:0-未激活,1-激活', `message_status` int(1) DEFAULT'1' COMMENT'短信提醒开启:0-未开启,1-开启', `letter_status` int(1) DEFAULT'1' COMMENT'站内信提醒开启:0-未开启,1-开启', `emailmsg_status` int(1) DEFAULT'0' COMMENT'邮件提醒开启:0-未开启,1-开启', `create_time` datetime DEFAULT NULL COMMENT'创建时间', `update_time` datetime DEFAULT NULL COMMENT'更新时间', `state` int(1) DEFAULT'1' COMMENT'是否可用,0-不可用,1-可用', PRIMARY KEY(`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户状态表';支付账户表

用户交易的核心表,存储用户相关的账户资金信息。

CREATE TABLE `ms_user_wallet`( `wallet_id` int(11) NOT NULL AUTO_INCREMENT COMMENT'钱包ID', `user_id` int(11) NOT NULL COMMENT'用户ID', `wallet_pwd` varchar(32) DEFAULT NULL COMMENT'钱包密码', `total_account` decimal(20,2) DEFAULT'0.00' COMMENT'账户总额', `usable_money` decimal(20,2) DEFAULT'0.00' COMMENT'可用余额', `freeze_money` decimal(20,2) DEFAULT'0.00' COMMENT'冻结金额', `freeze_time` datetime DEFAULT NULL COMMENT'冻结时间', `thaw_time` datetime DEFAULT NULL COMMENT'解冻时间', `create_time` datetime DEFAULT NULL COMMENT'创建时间', `update_time` datetime DEFAULT NULL COMMENT'更新时间', `state` int(1) DEFAULT'1' COMMENT'是否可用,0-不可用,1-可用', PRIMARY KEY(`wallet_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户钱包';二、设计规范 1、涉及模块

通过上面几个表设计的案例,可以看到表设计关联到数据库的各个方面知识:数据类型,索引,编码,存储引擎等。表设计是一个很大的命题,不过也遵循一个基本规范:三范式。

2、三范式基础概念

一范式

表的列的具有原子性,不可再分解,即列的信息,不能分解,关系型数据库MySQL、Oracle等自动的满足。

二范式

每个事实的数据记录只会出现一次,不会冗余,通常设计一个主键来实现。

三范式

要求一个表中不包含已经存在于其它表的非主键信息,例如部门和员工的信息,员工表包含部门表的主键ID,则可以关联获取相关信息,没必要在员工表保存相关信息。

优缺点对比

范式化设计

范式化结构设计通常更新快,因为冗余数据较少,表结构轻巧,也更好的写入内存中。但是查询起来涉及到关联,代价非常高,非常损耗查询性能。

反范式化设计

所有的数据都在一张表中,避免关联查询,索引的有效性更高,但是数据的冗余性极高。

建议结论

上述的两种设计方式在实际开发中都是不存在的,在实际开发中都是混合使用。比如汇总统计,缓存数据,都会基于反范式化的设计。

三、字段属性

合适的字段类型对于高性能来说非常重要,基本原则如下:简单的类型占用资源更少;在可以正确存储数据的情况下,选最小的数据类型。

1、数据类型选择整数类型

TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,根据数据类型范围合理选择即可。

实数类型

FLOAT、DOUBLE、DECIMAL,建议资金货币相关类型使用高精度DECIMAL存储,或者把数据成倍扩大为整数,采用BIGINT存储,不过处理相对麻烦。

字符类型

CHAR、VARCHAR,长度不确定建议采用VARCHAR存储,不过VARCHAR类型需要额外开销记录字符串长度。CHAR适合存储短字符,或者定长字符串,例如MD5的加密结构。

时间类型

DATETIME、TIMESTAMP,DATETIME保存大范围的值,精度秒。TIMESTAMP以时间戳的格式,范围相对较小,效率也相对较高,所以通常情况建议使用。

MySQL的字段类型有很多种,可以根据数据特性选择合适的,这里只描述常见的几种类型。

2、基础用法操作数据类型

修改字段类型

ALTER TABLE ms_user_sso MODIFY state CHAR(1) DEFAULT'0'; ALTER TABLE ms_user_sso MODIFY state INT(1) DEFAULT'1' COMMENT'状态:0不可用,1可用';

修改名称位置

ALTER TABLE ms_user_sso CHANGE log_ip login_ip VARCHAR(32) AFTER update_time;索引使用

索引类型:主键索引,普通索引,唯一索引,组合索引,全文索引。这里演示普通索引的操作。MySQL的核心模块,后续详说。

添加索引

ALTER TABLE ms_user_wallet ADD INDEX user_id_index(user_id); CREATE INDEX state_index ON ms_user_wallet(state);

查看索引

SHOW INDEX FROM ms_user_wallet;

删除索引

DROP INDEX state_index ON ms_user_wallet;

修改索引

不具有真正意义上的修改,可以把原有的索引删除之后,再次添加索引。

外键关联

用处:外键关联的作用保证多个数据表的数据一致性和完整性,建表时先有主表,后有从表;删除数据表,需要先删从表,再删主表。复杂场景不建议使用,实际开发中用的也不多。

添加外键

ALTER TABLE ms_user_wallet ADD CONSTRAINT user_id_out_key FOREIGN KEY(user_id) REFERENCES ms_user_center(id);

删除外键

ALTER TABLE ms_user_wallet DROP FOREIGN KEY user_id_out_key;四、表结构管理 1、查看结构 DESC ms_user_status; SHOW CREATE TABLE ms_user_status; 2、字段结构添加字段 ALTER TABLE ms_user_status ADD `delete_time` datetime DEFAULT NULL COMMENT'删除时间';删除字段 ALTER TABLE ms_user_status DROP COLUMN delete_time; 3、修改表名 ALTER TABLE ms_user_center RENAME ms_user_info; 4、存储引擎存储引擎 SELECT VERSION(); SHOW ENGINES;

MySQL 5.6支持的存储引擎有InnoDB、MyISAM、Memory、Archive、CSV、BLACKHOLE等。一般默认使用InnoDB,支持事务管理。该模块MySQL核心,后续详解。

修改引擎

数据量大的场景下,存储引擎修改是一个难度极大的操作,容易会导致表的特性变动,引起各种后续反应,后续会详说。

ALTER TABLE ms_user_sso ENGINE= MyISAM; 5、修改编码

表字符集默认使用utf8,通用,无乱码风险,汉字3字节,英文1字节,utf8mb4是utf8的超集,有存储4字节例如表情符号时使用。

查看编码 SHOW VARIABLES LIKE'character%';修改编码 ALTER TABLE ms_user_sso DEFAULT CHARACTER SET utf8mb4;五、数据管理 1、增删改查

添加数据

INSERT INTO ms_user_sso( user_id,sso_id,sso_code,create_time,update_time,login_ip,state) VALUES('1','SSO7637267','SSO78631273612','2019-12-24 11:56:57','2019-12-24 11:57:01','127.0.0.1','1');

更新数据

UPDATE ms_user_sso SET user_id='1',sso_id='SSO20191224',sso_code='SSO20191224', create_time='2019-11-24 11:56:57',update_time='2019-11-24 11:57:01', login_ip='127.0.0.1',state='1' WHERE user_id='1';

查询数据

一般情况下都是禁止使用 select*操作。

SELECT user_id,sso_id,sso_code,create_time,update_time,login_ip,state FROM ms_user_sso WHERE user_id='1';

删除数据

DELETE FROM ms_user_sso WHERE user_id='2';

不带where条件,就是删除全部数据。原则上不允许该操作,优化篇会详解。TRUNCATE TABLE也是清空表数据,但是占用的资源相对较少。

2、数据安全不可逆加密

这类加密算法,多用来做数据验证操作,比如常见的密码验证。

SELECT MD5('cicada')='94454b1241ad2cfbd0c44efda1b6b6ba'; SELECT SHA('cicada')='0501746a2e4fd34e1d14015fc4d58309585edc7d'; SELECT PASSWORD('smile')='*B4FB95D86DCFC3F33A3852714DC742C77504479D';可逆加密

安全性要求高的系统,需要做三级等保,对数据的安全性极高,数据在存储时必须加密入库,取出时候需要解密,这些就需要可逆加密。

SELECT DECODE(ENCODE('123456','key_salt'),'key_salt'); SELECT AES_DECRYPT(AES_ENCRYPT('cicada','salt123'),'salt123');

上述数据安全的管理,也可以基于应用系统的服务(代码)层进行处理,相对专业的流程是从数据生成源头处理,规避数据传递过程泄露,造成不必要的风险。

如果你还想了解更多这方面的信息,记得收藏关注本站。

mysql虚拟主机?虚拟主机空间如何与mysq数据库l连接恒创主机?恒创主机怎么样