CNode

个人可以绑定/解绑一个企业,数据库如何设计?

问答
Xxuxu7发布于7 年前最后回复7 年前16 回复8524 浏览0 收藏

一、背景

  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)

N
nwljy#1·7 年前

E_user--E_User_group--E_system_user---E_company

N
nwljy#2·7 年前
X
xuxu7#3·7 年前

E_user–E_User_group–E_system_user—E_company

这是表示的啥关系?

H
hejiaoshou#4·7 年前

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

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

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

H
hejiaoshou#6·7 年前
引用 xuxu7@hejiaoshou person表的person id和company表的company id都是自增长,他们有可能相同。那么article表的user id如果为 1,就不确定这个1是 ...

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

J
JsonSong89#7·7 年前

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

J
JsonSong89#8·7 年前

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 
J
JsonSong89#9·7 年前

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

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

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

H
hewentaowx#11·7 年前

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

X
xuxu7#12·7 年前
引用 hewentaowx为什么不考虑在文章表建立一个字段 isPerson 来标明是个人用户还是企业用户 如果isPerson为true就关联person id 如果为false就关联 company id

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

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

H
hewentaowx#13·7 年前

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

D
dafanzhi#14·7 年前

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

M
MessShawn#16·7 年前

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

参与回复
登录后即可参与回复。登录