一对多(反向)还是多对多?
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");
}
}
这是您可以在模型中定义的主要关系。
对于更复杂的关系,您可以使用此工具定义它们:
- 有许多直通
- eloquent join with getNamedAttribute 或 Laravel 范围
- BelongsToThrough.
我在数据库设计之间挣扎:
我有 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");
}
}
这是您可以在模型中定义的主要关系。
对于更复杂的关系,您可以使用此工具定义它们:
- 有许多直通
- eloquent join with getNamedAttribute 或 Laravel 范围
- BelongsToThrough.