一个 web 应用,有很多种用户类型,model/table 如何定义?

2020-02-04 22:03:18 +08:00
 chaleaoch

举个例子,

上面就是一个例子,我们有很多种类型的用户,想这种业务,表结构应该如何设计?

之前我做的系统,都是一个 User 表都搞定了.

也不知道说清楚没有,方案我能想到的三种

  1. django 中的多表继承. 但是不知道能不能在 django orm 中使用多重多表继承
  2. onetoone field
  3. 冗余设计,所有的用户类型都集成到 User 一个表中,里面放所有的字段.
1820 次点击
所在节点    程序员
11 条回复
luckycat
2020-02-04 22:14:48 +08:00
单独给每个用户建不同的 Model 如何?注册、登录时候加选项区分开来。
YIsion
2020-02-04 22:30:34 +08:00
多租户设计?
kevinguoCN
2020-02-04 22:46:13 +08:00
不要使用多表继承,对后续维护不利。
如果 不同类型的用户 没有其他不同的字段,可以使用一个字段进行区分。
如果 有不同的字段,强烈建议,建多张表,通过建立表间关系,这样在 orm 操作的时候,查询的效率也更高!
chaleaoch
2020-02-04 23:14:10 +08:00
@kevinguoCN
谢谢,有不同的字段,所以就会建立一对一映射,我这么理解对吗?

多表继承对后期维护不利就是说代码不直观是吗?

谢谢!
chaleaoch
2020-02-04 23:26:23 +08:00
@kevinguoCN
那如果前端传一个父表 ID,查询子表数据, 如何处理好?

举个例子.
主题中的五张表都有一个 oneone 映射 User
传 User 的 ID 我现在想知道 这是一个什么类型的用户.
两种方案
1. 加一个冗余字段.
2. if elif elif elif elif
是不是只能这样啦...
saulshao
2020-02-04 23:34:26 +08:00
从基本假设开始吧:
所有的用户都要有:用户名 /密码
供应商要有提供的服务和产品,要可以收钱
工人要有所属的供应商或者可以独立运作,工人要有单位时间工资。
客户要可以付钱

所有的设计都要围绕业务场景。我们假设业务场景如上描述,就这样了。

那么我的建议是用户表要有一个。这个表只存放大家都要有的字段,例如用户名和密码(当然要有 ID)。那些登录之类的,就可以只使用这个表来进行查询。
供应商则是关联到用户的另外一个表,可以有一些其他的属性(例如收款账号)和相关的信息,还可以关联到产品和服务。
工人和客户是第三、四个表,思路类似供应商。
后面的表都要有一个字段(一对一)关联到用户表,你可以直接使用用户表的 ID 字段当作后面 3 个表的主键 ID 字段,后果只是后面 3 个表的 ID 看起来是离散的。
但是我仍然建议要有独立的 ID 字段。
kevinguoCN
2020-02-05 00:47:04 +08:00
@chaleaoch
在 User 表中添加一个类似于角色的字段,建议使用整型,例如 1,供应商 2,工人

从前端获取到用户 id 后,可以通过判断上述字段

不同的值,可以通过 if 来判断,进而来通过反向查询其 子表的数据。
chenqh
2020-02-05 08:42:56 +08:00
独立的 ID 字段什么意思? sequence ?但是 MySQL 怎么搞 sequence ?
chaleaoch
2020-02-05 10:48:30 +08:00
@kevinguoCN 目前采用的就是类似的方式.谢谢!
chaleaoch
2020-02-05 10:54:29 +08:00
@chenqh 你应该 @saulshao
我也有此疑问,我的理解应该是
User 表 有 ID
worker oneone 映射 User, worker 的 ID == user ID, 但是 worker 还有一个字段 worker_id 是递增的.
saulshao
2020-02-05 16:08:58 +08:00
@chaleaoch #10 通常情况下,所有的表都应该有 ID 字段,不同的关系数据库有不同的实现方法,有的是自增,有的是 Sequence.
现代互联网应用还有用 GUID 字段当作 ID 的。总之这么做的意思是尽量不用业务字段去关联其他的表,因为业务字段的值可能会因为需求变化的原因而被修改。
在我举的例子中,worker_id 不是必须的,整个思路其实就是把原本计划用冗余字段的一个表,按照列分拆成为多个表,我所以建议有一个 worker_id,是因为后续扩展的时候,可以用不同的 ID 关联到不同的表,这么做就不需要使用文档来记录怎么写关联查询了。对性能也有帮助。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/642166

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX