【问题标题】:How to model my database for a one-to-many relationship如何为我的数据库建模一对多关系
【发布时间】:2021-01-09 06:33:16
【问题描述】:

我正在学习 Django 的后端开发,遇到了这个问题。

假设我正在设计一个旅行应用程序: 我有两个具有一对多关系的数据库 USERTRIP。即,每个用户可以有多次旅行,每次旅行只能由一个用户进行。

TRIP 有一列 trip-number。我想为添加到 TRIP 数据库中的每一行自动增加此列对于每个用户,从 1 开始,增量应该是独立的

行程表

user trip-number
1 1
2 1
1 2
1 3
2 2
3 1

类似的东西?我不能自动增加整个列,因为它对于用户的每次旅行都必须是唯一的,但是不同用户的数字可以相同。

理想情况下,我更喜欢在服务器端 (sql) 上自动执行此操作,而不是在客户端中编写逻辑。任何帮助,将不胜感激。谢谢

【问题讨论】:

  • 您可以为它创建插入/删除触发器,并找到每个用户的最大数量,并为新添加的记录添加一个。但我不建议使用触发器。相反,您可以创建一个视图,其中将为 trip_number 增加一列..
  • 这就是我现在正在做的事情。对于每次插入,我都会过滤并获取用户的旅行次数并增加它。但我想看看是否有更好的方法来做到这一点,而且我没有遗漏任何明显的东西。你的陈述的第二部分是什么意思?该表还有其他列,如源、目的地等,单独拉出trip_number列并使其成为一个单独的表并没有任何关联的意义对吧?
  • 不要这样做。只需存储一个 AI。

标签: mysql sql django


【解决方案1】:

使用trigger 更新trip_num 列是实现预期结果的一种方法,但我建议不要使用triggers,因为它有很多缺点。其中少数如下:

  • 您需要触发器来执行插入/删除/更新操作。
  • insert trigger 中,您必须为每个用户分配trip_number
  • update trigger中,您必须检查用户列是否更新,如果是,则必须相应地安排trip_number
  • delete trigger中,如果除用户最后一条记录之外的一条记录被删除,您将不得不整理所有trip_num
  • 如果同一用户同时发生两个事务,则触发器有可能将相同的trip_num 分配给同一用户的不同行。

因此,为避免这种情况,您可以使用view,如下所示:

Create view vw_name as
Select t.*, -- use column names and remove trip_num column 
       Row_number() over (partition by user order by trip_date) as trip_num
  From your_table t

【讨论】:

    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多