【问题标题】:REST-API database-relationships back-referencingREST-API 数据库关系反向引用
【发布时间】:2016-05-13 01:57:34
【问题描述】:

我正在开发一个带有 NodeJS 的 REST-API 和带有 MySQL 后端的 Express。现有数据库有很多 1:n 关系,我正在努力为这些特定情况找到正确的 URI 方案。

一个简单的例子:

user {
    id 
    name
}
comment {
    id
    text
    user_id
}

现在,当我尝试获取所有用户的列表时,我的 uri 将是:/users
- 对于一个特定的用户:/user/{id}
- 一位特定用户的数据:/user/{id}/name
- 所有 cmets 的列表:/comment
- 对于一个特定的评论:/comment/{id}
- 一条特定评论的数据:/comment/{id}/text

现在,我正在苦苦挣扎的部分。
用户和评论之间存在 1:n 的关系。一个用户可以有多个cmet,一个评论属于一个用户。我想实现类似“反向引用”的东西,这样当我访问一条特定评论的数据(即一个特定字段)时,我还可以获得评论“所属”的用户信息。
API 不知道这些关系,我也没有使用 ORM,所以无论如何我都必须在某处硬编码有关这些关系的信息。
我已经实现了一个路由,我可以在/comment/{id}/user_id 上发出请求,我将请求重定向到/user/{id},并带有评论所属的id。但是,当我只想获取该评论的用户 ID,而不是用户的整个数据集时,这将是相同的请求。
我已经阅读了很多关于 REST 架构的内容,并且 roy fielding 总是谈论使 API “可浏览”或“可探索”。我遇到的一种方法是向链接数据集添加参考 uri,在我的示例中,这意味着将 user_id 字段扩展为类似这样的内容:

user_id {
    id:id
    ref:/user/id
}

我从数据库中得到的结果比这复杂得多,提取相应的字段并添加这些信息似乎对于这个“简单”的问题有点费力。

我不知道我是否在这里遗漏了什么,我正在为一个项目开发这个 API,我还写了一篇关于该项目的论文,并且我尽量遵循 REST 架构的规则,但我现在有点卡住了。

【问题讨论】:

    标签: mysql node.js rest express


    【解决方案1】:

    像这样在用户资源“下”发布 cmets 怎么样:

    /user/{userid}
    /user/{userid}/comments/{commentid}
    

    请注意,您不必在 REST API 中一对一地发布“数据库行”。事实上,这通常是 REST 人员不赞成的。

    另外请注意,您不必将资源的每个属性都发布为资源。资源/user/{userid} 可以很好地返回包含所有必要数据的复杂(json、xml 等)表示。当然,有理由按照您的方式进行操作,例如,如果评论的文本以 pdf、文本、html 或其他我无法控制的格式提供,我会将其作为单独的资源。

    关于 Fielding 的“可浏览”API 的一个小问题:他的意思是这些资源通过返回数据表示中的链接相互引用。评论将引用用户(链接到用户),用户应该引用他们的 cmets(链接到 cmets)。客户端永远不必自己“猜测”或“构造”一个​​ URI,它应该只通过以下链接“浏览”资源!

    【讨论】:

    • 在我的项目中,调用 /user/id 之类的内容将为具有 JSON 中该 id 的用户返回整个数据库行,这确实是一个非常复杂的表示。我只需获取 id 并触发 SQL 请求并以 JSON 格式返回结果。为什么 REST 人对此不满意?你所说的菲尔丁正是我被困的地方。我很想在各个领域实现链接,但是对于我从数据库中获得的复杂数据集,这似乎不切实际
    • 您不必通过未修改的资源直接通过管道传输数据库。从数据库中获取数据并丰富它,至少使用链接。如果这不切实际,那么您可能需要重新设计。此外,您没有必须符合 REST。很多项目只是通过 HTTP 做 JSON,没有链接。只要是有意识的决定就可以了。
    猜你喜欢
    • 2016-05-18
    • 2013-10-20
    • 2012-12-25
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多