一对多(反向)还是多对多?

One To Many (Inverse) or Many To Many?

我在数据库设计之间挣扎:

我有 Table A(指标),其中存储了不同日期和来自不同网络的应用指标。

id app_id network date param1 param2 ...
1 A_123 A 2020-12-01
2 C_123 C 2020-12-01
3 B_123 B 2020-12-01
4 A_123 A 2020-12-02
5 A_123 A 2020-12-03
5 A_456 A 2020-12-01
5 A_456 A 2020-12-02
5 B_456 B 2020-12-02

A_123、B_123 和 C_123 是同一个应用程序,但来自不同的网络,这就是为什么我想创建映射以提供一个通用名称。

我有Table B(映射table)

id app_id name
1 A_123 App Name 1
2 B_123 App Name 1
3 C_123 App Name 1
4 A_456 App Name 2
5 B_456 App Name 2

现在我有一对多(反向):

public function mapping() {
    return $this->belongsTo('App\Models\Mapping', 'app_id', 'app_id');
}

但是像更新映射数据这样的操作似乎有点困难而且不正确,因为如果我想更改映射名称并删除一些app_id,我需要收集所有TableB.id并传递它编写脚本。更简单的是删除([1,2,3])并使用新的应用程序名称创建 3 个新记录。

然后我认为这可能是多对多,但似乎不是,因为例如在公制 table 中每个 app_id 我有 10k 条记录,如果我想映射 4 id 到 1 个名称,然后 table mapping_metric table 中的 1 个映射将是 40k 记录..这似乎比第一个设计更糟糕..

我最后的想法是,如果这两种方法都效果不佳,那么可能是我的指标 table 设计不当或其他原因。

您有什么想法或知道如何将 ID 映射到名称的方法吗?

首先要获得良好的数据库设计,因为我们的朋友建议您 table 必须进行规范化,所以我建议这个插图:

  • 一个table名称应用程序
  • 一个table名称网络
  • 一个支点table名字app_table
  • 一个table名称指标

他们之间的关系应该是这样的:

  • apps belongsToMany networks (pivot:app_table)

  • 网络 belongsToMany apps (pivot:app_table)

  • 应用有很多app_table

  • app_table 属于应用程序

  • 网络有很多app_table

  • app_table 属于网络

  • app_table 有许多指标

  • 指标属于 app_table

唯一重要的是你必须为你的枢轴本身制作一个模型

class App extends Model{

/**
      * retrive networks
      *
      * @return BelongsToMany networks
      */
     public function networks()
     {
         return $this->belongsToMany(App\Network::class, "app_table", "app_id", "network_id")
                        ->withPivot("deleted_at")
                        ->using(App\AppNetwork::class);
     }

/**
      * retrive app_networks
      *
      * @return hasMany [description]
      */
     public function appNetworks()
     {
         return $this->hasMany(App\AppNetwork::class, "app_id")->withTrashed();
     }

}

网络模型与反向关系相同。

但对于枢轴 table 模型,您必须从 Illuminate\Database\Eloquent\Relations\Pivot 扩展并设置 public $incrementing = true; 以增加 id automatic

class AppNetwork extends Pivot
{

    public $incrementing = true;

public function network()
    {
        return $this->belongsTo(App\Network::class);
    }

    public function app()
    {
        return $this->belongsTo(App\App::class);
    }

    public function metrics()
    {
        return $this->hasMany(App\Metrics::class, "app_network_id");
    }

}

这是您可以在模型中定义的主要关系。

对于更复杂的关系,您可以使用此工具定义它们: