个人可以绑定/解绑一个企业,数据库如何设计?
发布于 5 年前 作者 xuxu7 7068 次浏览 来自 问答

一、背景

  1. 用户可以发布文章,可以通过企业认证来绑定企业,可以解绑企业。
  2. 当账号绑定企业后就以企业身份发布 (文章关联company_id);解绑后就以个人身份发布 (文章关联person_id)。
  3. 只有个人 ( person ) 才有账号,也就是说只能用个人账户登录。

二、问题

请问用户表和文章表怎么设计?

三、我的方案

person 表保存个人信息和用户名、密码信息,company表的数据在企业认证时生成并把 company_id 填入 person表:

CREATE TABLE `person` (
  `person_id` int unsigned NOT NULL AUTO_INCREMENT,
  `company_id` int unsigned DEFAULT NULL COMMENT '企业认证id',
  `username` varchar(255) NOT NULL
  `password` varchar(255) NOT NULL
  PRIMARY KEY (`person_id`),
) 

CREATE TABLE `company` (
  `company_id` int unsigned NOT NULL AUTO_INCREMENT  COMMENT '企业认证id',
  PRIMARY KEY (`company_id`),
) 

CREATE TABLE `article` (
  `article_id` int unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'person_id 或者 company_id',
  `user_type` varchar(20) NOT NULL COMMENT 'person 或者 company'
  PRIMARY KEY (`article_id`),
)  

但问题是:如果按如上方式设计 person、company 表的话,类似 article 的很多表就需要保存 user_type,比较麻烦,有更好的设计吗?

16 回复

E_user–E_User_group–E_system_user—E_company

E_user–E_User_group–E_system_user—E_company

这是表示的啥关系?

我的理解是用户相关的都应该放在user表里,即你的person表。那么 usertype 字段也应该在该表?article表只存储文章相关内容以及一个与用户绑定的唯一标识,需要用户信息拿标识去用户表查询。

@hejiaoshou person表的person_idcompany表的company_id都是自增长,他们有可能相同。那么article表的user_id如果为 1,就不确定这个1是 person 还是 company

@xuxu7 这个问题就要看你的业务逻辑是什么来具体分析了。我目前主业是前端,只是偶偶写写node,但我认为这个问题并不复杂。

感觉挺简单的啊 文章永远关联个人,查询文章时候,join一下个人 如果个人在企业上,文章就显示企业,否则显示个人

CREATE TABLE article ( article_id int unsigned NOT NULL AUTO_INCREMENT, person_id int unsigned NOT NULL AUTO_INCREMENT COMMENT 'person_id ', user_type varchar(20) NOT NULL COMMENT 'person 或者 company’ PRIMARY KEY (article_id), )

select a.*,p.id,p.companyId from article left jon persion p on a.person_id = p.id 

文章不应该保存公司的任何信息,因为文章和公司没有直接关系 你画个er图或者domain模型就能分析出来. 所有的变化都在个人-公司上,和文章无关

@JsonSong89 谢谢!需求要求:个人和企业解绑后,以企业身份发布的文章依然属于企业,所以若文章只和 person 关联的话,解绑后就无法保证文章和企业的关系了。

为什么不考虑在文章表建立一个字段 isPerson 来标明是个人用户还是企业用户 如果isPerson为true就关联person_id 如果为false就关联 company_id

@hewentaowx 目前的做法是在文章表里通过 user_type ENUM('person', 'company') 枚举类型字段来区分,和isPerson 的作用一样。

就是感觉麻烦:其他表需要关联user_id的地方也必须添加user_type字段。

@xuxu7 那你觉得麻烦 可以person表用自增主键关联 company加一个uuid来关联文章表 这样person表的id和company就不会存在一致的情况了

如果你会写 SQL,现在可以直接写 SQL 完成你的 SaaS 供多个企业使用:https://wuyuan.io

@hewentaowx 不太理解具体怎样的,能在数据库表结构上给具体的提示吗?

设计一个文章版本表,每次发布文章时,如果是个人用户发布,就插入一条个人用户关联上的版本数据,如果是企业用户就插入一条企业和个人都关联的版本数据,当用户和企业解绑时,更新这条数据,把个人用户关联去掉就行了;展示的时候查一下这张表,以企业关联优先就行了;一般表设计思路不是这个表自身的信息一概不存,用中间表来表示。

回到顶部