【问题标题】:Proper way to provide a One-to-Many from an API?从 API 提供一对多的正确方法?
【发布时间】:2020-04-30 18:41:02
【问题描述】:

我已尝试搜索互联网并接受我可能不知道找到解决方案所需的适当术语。我可以参考阅读材料,但我不确定从哪里开始。

对于堆栈,我使用的是 Angular + NestJS。计划使用 Postgres 作为数据库集成 TypeORM。

我有以下实体,其中一个预算有一个项目,一个项目可能有多个预算:

export interface Budget {
  id: number;
  description: string;
  project_id: number;
  budget_type: string;
  budget_status: string;
}

export interface Project {
  id: number;
  project_number: string;
  project_title: string;
  project_status: string;
  client: string;
}

对于这种情况,我想在一个角度材料表中显示预算列表,并在表中显示“project_number”而不是“project_id”。

  1. 我是否应该修改 Budget 接口定义以返回它的 Project?

  1. 我应该让应用通过 API 请求项目资源吗?

一般来说,对于持有对具有 id 的其他实体的引用的实体。我应该将这些实体包含在 API 的响应中还是将它们嵌套到响应中。

我是否应该修改 Budget 接口定义以返回它的 Project? 关注点:对于嵌套程度更高的对象,可能存在比实际需要更多的数据。

{
    "budgets": [{
            "id": 1,
            "description": "platea dictumst",
            "project": {
                "id": 3,
                "project_number": "19139",
                "project_title": "neque aenean auctor gravida",
                "project_status": "Lost",
                "client": "Eabox"
            },
            "budget_type": "Change Order",
            "budget_status": "Approved"
        },
        {
            "id": 2,
            "description": "et commodo vulputate justo in blandit",
            "project": {
                "id": 78,
                "project_number": "19356",
                "project_title": "et eros vestibulum ac est",
                "project_status": "Active",
                "client": "Kimia"
            },
            "budget_type": "Original",
            "budget_status": "Lost"
        }
    ]
}

我应该让应用通过 API 请求项目资源吗? 关注点:如果我有 100 个预算,这将是应用程序等待表加载时对 API 的额外调用 100 次。

{
  "budgets": [
    {
      "id": 1,
      "description": "platea dictumst",
      "project_id": 3,
      "budget_type": "Change Order",
      "budget_status": "Approved"
    },
    {
      "id": 2,
      "description": "et commodo vulputate justo in blandit",
      "project_id": 78,
      "budget_type": "Original",
      "budget_status": "Lost"
    }
  ]
}

【问题讨论】:

  • 您可以简单地将 project_number 也包含到预算界面中。使用 project_number 显示在表格中,使用 project_id 引用项目实体。这样可以避免额外的读取复杂性。
  • 原问题中提供的项目/预算关系只是一个简单的例子。我打算为实体添加更多属性。将在列表中显示的某些对象具有多个一对多关系。

标签: angular rest api nestjs


【解决方案1】:

我不明白数组。您问“我应该修改 Budget 接口定义以返回 Projects 数组吗?”但是“一个预算有一个项目,一个项目可能有很多预算”。

您不应将项目数组放入预算中。另外,由于每个预算只有一个项目...我不明白它是一个数组。

Here 是一些读数,但您想列出整个预算表。您需要来自另一个表的数据(不仅仅是 ID),因此您可以进行连接。 Here 是关于联接类型的 StackOverflow 帖子。下面是一个获取 SQL 查询的 project_number 的示例:

SELECT Budget.id, Budget.description, Project.project_number
FROM Budget
LEFT JOIN Project ON Budget.project_id = Budget.id

由于这可以在 SQL 中轻松完成,因此您无需更改架构。使用 SQL 时,您应该优先考虑一对多而不是多对多,并且应该使用“many”中的键来指向“one”。

【讨论】:

  • 感谢您的回复。 SQL 不是问题。我的问题更多是关于 API 的实现。我是发送嵌套在预算中的项目.. 还是在应用收到预算后对 API 执行另一次点击以获取项目。
  • 另外,你是对的。我把描述弄乱了。我在想相反的事情。如果我要从 API 请求项目.. 我是否应该将其他实体的“id”发送到应用程序,或者我应该在响应中包含实体。
猜你喜欢
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2019-05-09
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多