举个例子,
上面就是一个例子,我们有很多种类型的用户,想这种业务,表结构应该如何设计?
之前我做的系统,都是一个 User 表都搞定了.
也不知道说清楚没有,方案我能想到的三种
1
luckycat 2020-02-04 22:14:48 +08:00
单独给每个用户建不同的 Model 如何?注册、登录时候加选项区分开来。
|
2
YIsion 2020-02-04 22:30:34 +08:00 via Android
多租户设计?
|
3
kevinguoCN 2020-02-04 22:46:13 +08:00 1
不要使用多表继承,对后续维护不利。
如果 不同类型的用户 没有其他不同的字段,可以使用一个字段进行区分。 如果 有不同的字段,强烈建议,建多张表,通过建立表间关系,这样在 orm 操作的时候,查询的效率也更高! |
4
chaleaoch OP |
5
chaleaoch OP @kevinguoCN
那如果前端传一个父表 ID,查询子表数据, 如何处理好? 举个例子. 主题中的五张表都有一个 oneone 映射 User 传 User 的 ID 我现在想知道 这是一个什么类型的用户. 两种方案 1. 加一个冗余字段. 2. if elif elif elif elif 是不是只能这样啦... |
6
saulshao 2020-02-04 23:34:26 +08:00 1
从基本假设开始吧:
所有的用户都要有:用户名 /密码 供应商要有提供的服务和产品,要可以收钱 工人要有所属的供应商或者可以独立运作,工人要有单位时间工资。 客户要可以付钱 所有的设计都要围绕业务场景。我们假设业务场景如上描述,就这样了。 那么我的建议是用户表要有一个。这个表只存放大家都要有的字段,例如用户名和密码(当然要有 ID)。那些登录之类的,就可以只使用这个表来进行查询。 供应商则是关联到用户的另外一个表,可以有一些其他的属性(例如收款账号)和相关的信息,还可以关联到产品和服务。 工人和客户是第三、四个表,思路类似供应商。 后面的表都要有一个字段(一对一)关联到用户表,你可以直接使用用户表的 ID 字段当作后面 3 个表的主键 ID 字段,后果只是后面 3 个表的 ID 看起来是离散的。 但是我仍然建议要有独立的 ID 字段。 |
7
kevinguoCN 2020-02-05 00:47:04 +08:00 2
@chaleaoch
在 User 表中添加一个类似于角色的字段,建议使用整型,例如 1,供应商 2,工人 从前端获取到用户 id 后,可以通过判断上述字段 不同的值,可以通过 if 来判断,进而来通过反向查询其 子表的数据。 |
8
chenqh 2020-02-05 08:42:56 +08:00 via Android
独立的 ID 字段什么意思? sequence ?但是 MySQL 怎么搞 sequence ?
|
9
chaleaoch OP @kevinguoCN 目前采用的就是类似的方式.谢谢!
|
10
chaleaoch OP |
11
saulshao 2020-02-05 16:08:58 +08:00 1
@chaleaoch #10 通常情况下,所有的表都应该有 ID 字段,不同的关系数据库有不同的实现方法,有的是自增,有的是 Sequence.
现代互联网应用还有用 GUID 字段当作 ID 的。总之这么做的意思是尽量不用业务字段去关联其他的表,因为业务字段的值可能会因为需求变化的原因而被修改。 在我举的例子中,worker_id 不是必须的,整个思路其实就是把原本计划用冗余字段的一个表,按照列分拆成为多个表,我所以建议有一个 worker_id,是因为后续扩展的时候,可以用不同的 ID 关联到不同的表,这么做就不需要使用文档来记录怎么写关联查询了。对性能也有帮助。 |