一、背景
- 用户可以发布文章,可以通过企业认证来绑定企业,可以解绑企业。
- 当账号绑定企业后就以企业身份发布 (文章关联
company_id
);解绑后就以个人身份发布 (文章关联person_id
)。 - 只有个人 (
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
,比较麻烦,有更好的设计吗?
E_user–E_User_group–E_system_user—E_company
@nwljy 不麻烦
E_user–E_User_group–E_system_user—E_company
这是表示的啥关系?
我的理解是用户相关的都应该放在user表里,即你的person表。那么 usertype 字段也应该在该表?article表只存储文章相关内容以及一个与用户绑定的唯一标识,需要用户信息拿标识去用户表查询。
@hejiaoshou person
表的person_id
和company
表的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 不太理解具体怎样的,能在数据库表结构上给具体的提示吗?
设计一个文章版本表,每次发布文章时,如果是个人用户发布,就插入一条个人用户关联上的版本数据,如果是企业用户就插入一条企业和个人都关联的版本数据,当用户和企业解绑时,更新这条数据,把个人用户关联去掉就行了;展示的时候查一下这张表,以企业关联优先就行了;一般表设计思路不是这个表自身的信息一概不存,用中间表来表示。