V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chaleaoch
V2EX  ›  程序员

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

  •  
  •   chaleaoch · 2020-02-04 22:03:18 +08:00 · 1895 次点击
    这是一个创建于 1754 天前的主题,其中的信息可能已经有所发展或是发生改变。

    举个例子,

    • 供应商
      • 小商贩
      • 服务商
    • 工人
    • 客户

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

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

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

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

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

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

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

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

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

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

    不同的值,可以通过 if 来判断,进而来通过反向查询其 子表的数据。
    chenqh
        8
    chenqh  
       2020-02-05 08:42:56 +08:00 via Android
    独立的 ID 字段什么意思? sequence ?但是 MySQL 怎么搞 sequence ?
    chaleaoch
        9
    chaleaoch  
    OP
       2020-02-05 10:48:30 +08:00
    @kevinguoCN 目前采用的就是类似的方式.谢谢!
    chaleaoch
        10
    chaleaoch  
    OP
       2020-02-05 10:54:29 +08:00
    @chenqh 你应该 @saulshao
    我也有此疑问,我的理解应该是
    User 表 有 ID
    worker oneone 映射 User, worker 的 ID == user ID, 但是 worker 还有一个字段 worker_id 是递增的.
    saulshao
        11
    saulshao  
       2020-02-05 16:08:58 +08:00   ❤️ 1
    @chaleaoch #10 通常情况下,所有的表都应该有 ID 字段,不同的关系数据库有不同的实现方法,有的是自增,有的是 Sequence.
    现代互联网应用还有用 GUID 字段当作 ID 的。总之这么做的意思是尽量不用业务字段去关联其他的表,因为业务字段的值可能会因为需求变化的原因而被修改。
    在我举的例子中,worker_id 不是必须的,整个思路其实就是把原本计划用冗余字段的一个表,按照列分拆成为多个表,我所以建议有一个 worker_id,是因为后续扩展的时候,可以用不同的 ID 关联到不同的表,这么做就不需要使用文档来记录怎么写关联查询了。对性能也有帮助。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   928 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:19 · PVG 05:19 · LAX 13:19 · JFK 16:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.