【发布时间】:2021-03-19 12:44:02
【问题描述】:
我在数据库设计之间苦苦挣扎:
我有表 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 是同一个应用程序,但来自不同的网络,这就是为什么我想创建映射以提供一个通用名称。
我有表 B(映射表)
| 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 条新记录。
然后我认为这可能是多对多,但似乎不是,因为例如在每个 app_id 的 Metric 表中,我有 10k 条记录,如果我想将 4 个 id 映射到 1 个名称,那么对于 1 个映射表 mapping_metric 表将是 40k 记录.. 这似乎比第一个设计更糟糕..
我最后的想法是,如果这两种方法都不能正常工作,那么可能是我的 Metrics 表设计得不好或其他原因。
你有什么想法或者你知道一些方法如何将 id 映射到名称?
【问题讨论】:
-
您的问题是您的数据未正确规范化。 1NF 要求每个行列交集包含一个值。在这里,您在
APP_ID中编码两个值,即源网络和应用程序 ID。您需要将这两者分成app_id和123, 456等和源网络A, B, C等。这样你就可以建立适当的关系。您可能需要也可能不需要第三个表来保存所有可能的源网络,如果它只是少数并且没有额外的元数据,那么它可能不值得努力
标签: php database laravel mapping