账号表
CREATE TABLE `account`( `id` BIGINT NOT NULL COMMENT '主键ID', `user_id` BIGINT NOT NULL COMMENT '用户ID', `account` VARCHAR(64) NOT NULL COMMENT '账号', `password` VARCHAR(128) NOT NULL COMMENT '密码', `account_type` int DEFAULT 1 COMMENT '账号类型 {[1:邮箱] [2:手机] [3:工号]}' ........)
用户表
CREATE TABLE `user`( `id` BIGINT NOT NULL COMMENT '主键ID', `name` VARCHAR(128) NOT NULL COMMENT '姓名', `avatar` VARCHAR(255) default null comment '头像', `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注' ........)
员工信息表
CREATE TABLE `employee`( `id` BIGINT NOT NULL COMMENT '主键ID', `user_id` BIGINT NOT NULL COMMENT '用户ID', `employee_no` int NOT NULL COMMENT '工号', `join_date` date NOT NULL COMMENT '入职时间' ........)
user与account是一对多
user与employee是一对一
系统需要支持以工号、邮箱、手机号登录(手机验证码或密码)
在上述表设计中会存在一下问题
根据以上情况,这些表改如何优化
保留 user表
和 account表
,可以理解为 account表
是 user表
的子表;请问,临时员工和正式员工区别的作用是什么?
如果是为了方便后续权限控制的话,直接在user 表
加标识字段type
即可。以下是具体的数据表设计:
user表
CREATE TABLE `user`( `id` BIGINT NOT NULL COMMENT '主键ID', `name` VARCHAR(128) NOT NULL COMMENT '姓名', `avatar` VARCHAR(255) default null comment '头像', `employee_no` int NOT NULL COMMENT '工号', `join_date` date NOT NULL COMMENT '入职时间', `password` VARCHAR(128) NOT NULL COMMENT '密码', `email` VARCHAR(255) DEFAULT NULL COMMENT '邮箱', `employee_no` INT DEFAULT NULL COMMENT '工号', `phone` VARCHAR(16) DEFAULT NULL COMMENT '手机号', `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', `type` bit(1) NULL DEFAULT 1 COMMENT '是否正式员工,0临时,1正式' ......)
account表
CREATE TABLE `account`( `id` BIGINT NOT NULL COMMENT '主键ID', `user_id` BIGINT NOT NULL COMMENT '用户ID', `account` VARCHAR(64) NOT NULL COMMENT '账号', `account_type` int DEFAULT 1 COMMENT '账号类型 {[1:邮箱] [2:手机] [3:工号]}' ........)
请问,账号的account_type的作用是什么呢?
只是为了标识,还是用户登录的时候需要填写对应的信息传递给后端呢?
如果登录的时候用户只需要填写账号和密码
,和account_type
无关的话,就是常规的登录逻辑:用户填写账号和密码 -->后端根据账号,查询对应用户,核对密码是否正确......
从你的描述问题2来看,账户与密码、账户与用户都是多对一,用户和密码是一对一,所以登录密码应该是用户级别的属性而非账户的属性。登录的过程就变成:根据提交的账户名称和账户类型查找用户级别的信息,如果密码符合用户的密码就可以登录;这样就避免了你问题3中提到的需要同步改多条账户记录的问题。
不过,我觉得除非你们需要考虑一个用户可以绑多个邮箱、多个手机号这种情况,不然不太需要将同一个人的账户拆成多个,而是将不同账户类型的账户名放在不同字段里,比如
CREATE TABLE `account`( `id` BIGINT NOT NULL COMMENT '主键ID', `user_id` BIGINT NOT NULL COMMENT '用户ID', `email_account` VARCHAR(64) COMMENT '邮箱账号', `mobile_account` VARCHAR(64) COMMENT '手机号码账号', `employee_no_account` VARCHAR(64) COMMENT '员工工号账号', `password` VARCHAR(128) NOT NULL COMMENT '密码', ........)
然后根据用户登录时前端传递过来的账号类型选择查询account表的哪一列作为账号名。如果没有绑定邮箱、或者改用户不是员工,那么account表中对应的字段就是空的。需要绑定邮箱或绑定员工信息时,将account表同步更新。
关于查询用户信息时需要显示用户的邮箱、手机号等信息,以及同步修改,我认为联表查询和跨表修改都是合理的,没有什么不可接受的地方。而且你用户表和员工表是明显分开的,如果要查用户的时候显示员工信息就是不可避免的连表查询。
身份验证信息(邮箱、手机号、密码这些)放在一个表里,然后把用户详细信息(姓名、头像这些)放在另一个表里。用单一密码字段,如果说一个用户的所有账号共享相同的密码的话,那只要在账号表里存一个密码字段就行。
CREATE TABLE `user`( `id` BIGINT NOT NULL COMMENT '主键ID', `name` VARCHAR(128) NOT NULL COMMENT '姓名', `avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像', `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', `email` VARCHAR(255) DEFAULT NULL COMMENT '邮箱', `phone` VARCHAR(16) DEFAULT NULL COMMENT '手机号', `employee_no` INT DEFAULT NULL COMMENT '工号' ........)CREATE TABLE `auth`( `id` BIGINT NOT NULL COMMENT '主键ID', `user_id` BIGINT NOT NULL COMMENT '用户ID', `identity` VARCHAR(255) NOT NULL COMMENT '标识(可以是邮箱、手机号或工号)', `password` VARCHAR(128) NOT NULL COMMENT '密码', `identity_type` INT DEFAULT 1 COMMENT '账号类型 {[1:邮箱] [2:手机] [3:工号]}' ........)CREATE TABLE `employee`( `id` BIGINT NOT NULL COMMENT '主键ID', `user_id` BIGINT NOT NULL COMMENT '用户ID', `join_date` DATE NOT NULL COMMENT '入职时间' ........)
感觉 直接去掉 account
表,相关字段 放回 user
表就解决问题了
1 邮箱、手机号、工号 等都在 user
表里了
2 密码只有一个在 user
表里
3 查询用户信息的时候不跨表
4 没有 employee
信息的就是临时用户
登录的时候根据用户表单输入或者选择的类型,直接从 account
里查找也没啥问题
问题内容: 一个客户可以有多个电话号码,例如手机,工作场所等。“客户”表中的phoneID是唯一的,并且指向“电话”表中的PhoneID。如果删除了客户记录,则“电话”表中的phoneID也应删除。 您对我的设计有任何疑问吗?这个设计合理吗?我的问题是客户表中的phoneID是子项,如果子项记录被删除,那么我无法自动删除父项(电话)记录。 问题答案: 由于mrjoltcola已经解决了标准化问题,
问题内容: 让我们说我需要设计一个数据库,该数据库将托管多个公司的数据。现在出于安全和管理目的,我需要确保正确隔离了不同公司的数据,但我也不想启动10个mysql进程来在10个不同的服务器上托管10个公司的数据。使用mysql数据库执行此操作的最佳方法是什么。 问题答案: 多租户数据库有几种方法。为了进行讨论,它们通常分为三类。 每个租户一个数据库。 共享数据库,每个租户一个模式。 共享数据库,共
问题内容: 我正在建立一个网站,其中包含不同类型的项目,例如博客,帖子,文章等。用户可以将其中任何一个设置为他/她的最爱。现在,当我处理这个问题时,我有两个选择 为每种对象的用户收藏夹创建一个表。 为所有用户的所有类型的对象创建一个公用表。 第一种结构的问题是,我将不得不查询很多表以显示特定用户的收藏夹。但这将使我可以轻松地将收藏夹分为不同的类别。 但是,如果我必须在一个页面上显示所有收藏夹并将它
1、数据库设计最起码要占用这个项目开发的40%以上的时间 2、数据库设计不仅仅停留在页面demo的表面 页面内容所需字段,在数据库设计中只是一部分,还有系统运转、模块交互、中转数据、表之间的联系等等所需要的字段,因此数据库设计绝对不是简单的基本数据存储,还有逻辑数据存储。 3、数据库设计完成后,项目80%的设计开发都要存在你的脑海中 每个字段的设计都要有他存在的意义,要清楚的知道程序中如何去运用这
问题内容: 我有一个关于桌子设计的问题。我有一个应该认为可行的解决方案,但是没有。 考虑具有两个实体“ Subject”和“ Process”,它们都具有某些属性。每个“主题”可以与多个“进程”相关联。根据选择哪个“过程”,存在不同数量的实体“过程属性”。换句话说,当用户将“过程”与“主题”相关联时,他应该只能编辑专门链接到该“过程”的“属性”。 最终,我希望用户能够执行3件事: 创建新的“流程”
在完成了 DaoCloud 账号的注册后,您大可不必着急使用 DaoCloud 所提供的服务,而是可以先对您的 DaoCloud 账号进行一些必要的了解和设置。 账号信息 在个人设置页面中,第一个标签页便是账号的基本信息设置页面。在这个页面中,您可以查看并更改账号当前使用的套餐。 一个新注册的账号默认使用的是免费套餐,DaoCloud 云资源的配额为 2x。 您也可以根据实际需要随时更改账号的套餐