gpt4 book ai didi

需要 MySQL 数据库结构建议。从一个表到另外两个表的两个多对多,它们处于一对多关系

转载 作者:行者123 更新时间:2023-11-29 20:34:40 25 4
gpt4 key购买 nike

我有这个设置作为我的数据库结构,它已经运行得很好,但我觉得它可以更好,但不知道如何。

数据库结构:-
database structure

事件可以有多个子事件。用户可以加入这些事件以及可选的子事件。有了这种结构,我就有了所有的限制,但是将参加的事件与子事件参加者联系起来=>可以有子事件参加者在没有参加主事件的情况下留下(这应该是不可能的,因为用户不参加)主事件不能参加其子事件)。

我目前正在使用 Laravel,所以它看起来像这样:

用户:

  • hasMany Event(作为这些事件的组织者)
  • belongsToMany EventAttending(用户加入哪些事件)
  • belongsToMany SubEventAttending(哪些子事件是用户加入)

事件:

  • 属于用户
  • 有很多子事件
  • belongsToMany EventAttending(哪些用户正在参加此事件)

子事件:

  • 属于事件
  • belongsToMany SubEventAttending(哪些用户正在参加此子事件)

当尝试管理用户的子事件出席时会出现问题。我如何使事件和子事件参加者之间存在这种约束,同时利用 Laravel 的功能保持干净/您可以为更好的结构提供什么建议/你们会怎么做?

编辑

需要澄清的是,事件和子事件存储不同的内容,具有不同的属性。此外,我还需要存储事件参加者的信息(就像他在现实生活中参加过的那样)和子事件参加者的信息,很可能是不同的。

编辑

Edward Haber 具有更好的结构,但由于我的两个数据透视表(用户事件和用户子事件之间的连接)存储了额外的不同类型的信息,目前选择保留初始设计。

我面临的最大问题之一(这两种结构都存在)是在获取已参加的事件和已参加的子事件时查询用户。试图达到这个结果:

User[]:{  
...,
attending_events[]:{
...,
attending_sub_events[]:{
...
}
}
}

花了几个小时思考一个干净的解决方案,但没有其他任何东西可以工作。不想手动编写整个 SQL 查询。我当前使用两个数据透视表的实现如下所示(结果未嵌套,代码困惑):

$users = User::withCount(['attendingEvents' => function($query) use($eventId){
$query->where('event_id', $eventId);
}])
->with(['attendingSubEvents' => function($query) use($eventId){
$query->select('id')->whereHas('event', function($query) use($eventId){
$query->where('id', $eventId);
});
}]);

通过这种方法,我可以将子事件与主事件分开。 (只查询主要参加事件的人数,因为我只需要确定他是否参加)。

最佳答案

此类解决方案的模式是使用 Polymorphic Relationship 。该解决方案仅侧重于将用户连接到事件和子事件 - 其余关系看起来是正确的。

<?php
class User extends Model {
public function attending() {
return $this->morphTo();
}
}

<?php
class Event extends Model {
public function attendees() {
return $this->morphMany('App\User', 'attending')
}
}


<?php
class Subevent extends Model {
public function attendees() {
return $this->morphMany('App\User', 'attending')
}
}

users 表需要以下字段:

*users*
-----
id
attending_id
attending_type

这一切都未经测试 - 但基本思想。 (编辑:将多态方法的名称更改为出席者参加)

关于需要 MySQL 数据库结构建议。从一个表到另外两个表的两个多对多,它们处于一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38860130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com