将复杂的嵌套 SQL 关联转换为可管理服务的前端数据建模最佳实践是什么?
What are the front-end data modeling best practices for translating complex nested SQL associations into manageable services?
我正在寻求解决此问题的可能解决方案的观点。我将使用 Angular 和 Rails,但实际上这个问题有点抽象,不需要在这些框架的上下文中回答。
在前端管理复杂嵌套 SQL 关联的最佳实践是什么?
假设您有 post 并且评论和评论嵌套在 post 下。您将 post 作为 JSON 发送到前端,并在其下嵌套注释。现在您可以在每个 post 下列出它们,太棒了。但随之而来的问题是:
如果你也想显示最近的评论怎么办?您的评论服务需要在规范化集合中包含评论,或者以允许按日期排序的方式访问它们。
- 这是否意味着您单独 API 征集按日期排序的评论?这会在前端复制评论,并要求您在两个地方而不是一个地方更新它们(一个用于 posts,一个用于评论,假设可以编辑或更新评论)。
- 您是否实施了某种前端数据规范化?这意味着您有一个缓存层来保存嵌套数据,然后您将各个资源分配给它们相应的服务?
如果您的数据具有不同的嵌套级别怎么办?继续 post 和注释示例。如果您的评论可以回复到 10 级呢?
- 如果您单独 API 调用 post 和评论,这对您的数据模型有何影响?
- 如果您选择那种方法,这对您的缓存层有何影响?
如果我们不只是谈论 post 怎么办?如果您可以对照片和其他资源发表评论怎么办?
- 这对上述数据建模模式的两个选项有何影响?
脱离示例,如果我们谈论的是好友用户之间的递归关系怎么办?
我的初步想法和假设的解决方案
我最初的想法以及我将如何攻击它是使用缓存层并对数据进行规范化,以便:
- 缓存层处理任何必要的规范化
- 缓存层保存每个记录的 ONE 个规范表示
- 服务与缓存层通信以执行 CRUD 操作
- 服务通常不关心他们也不需要知道nested/complex数据模型是怎样的,当数据到达服务时它被规范化了
递归关系在某些时候需要是有限的,您不能永远继续嵌套。
这当然听起来不错,但我看到了很多潜在的陷阱,并希望获得更多见解。我发现很难将抽象的最佳实践与特定数据模型的具体解决方案分开。我很想知道其他人是如何解决这个问题的,以及他们将如何着手解决它。
谢谢!
我假设你会使用 restful apis,注意我不知道 rails 但我会建议你一些你可能会考虑的通用做法
假设您有一个页面显示 10 posts 和他们的 10 条评论按日期排序,在一次 api 调用
中实现此响应
还有一页仅显示 5 post 秒,并且没有评论使用相同的 api 终点
使用一些查询参数使这成为可能。
尽量优化您的回复。
如果我们谈论 API这就是我的工作方式,您可以在任何编程语言中在一个端点有多种响应类型。
如果您的查询花费很多时间,并且该查询运行了多次,那么您当然需要缓存,但在每个 api 调用中谈论 10 post 秒不需要缓存。它应该不会对数据库造成影响。
对于嵌套问题,你可以有一种机制让它成为可能,即
我将获取 10 posts 和他们的所有评论,我可以发送一个查询参数,我想包含每个 post
的所有评论
喜欢bar.com/api/v1/posts?include=comments
如果他们的评论我只需要一些自定义数据,我应该能够实现一些自定义包含。
喜欢bar.com/api/v1/posts?include=recent_comments
你API层,应该首先匹配你的自定义包含如果没有找到继续资源关系
用于更深入的参考,例如 comments.publisher 或 recent_comments.publisher 您的 API 层需要了解您目前正在使用哪种资源。普通包含不需要这个,但是自定义包含应该描述 model/resource 它们指向什么,这样就可以创建无限链
我不知道Rails,但如果你有一个强大的ORM/ODM
,你可以很容易地使这个模式成为可能
有时,您也需要做一些过滤,这项工作也一样。
你可以有过滤器查询参数并实现一些自定义过滤器
即
bar.com/api/v1/posts?include=recent_comments&filters=favorites
或者忘记一切,在下面做点什么
bar.com/api/v1/posts?transformation=PageA
这将 return 10 个最近的 posts 以及他们最近的 10 个评论
bar.com/api/v1/posts?transformation=PageB
这将 return 只有 10 最近 posts
bar.com/api/v1/posts?transformation=PageC
这将 return 10 最近 post 和他们的所有评论
我正在寻求解决此问题的可能解决方案的观点。我将使用 Angular 和 Rails,但实际上这个问题有点抽象,不需要在这些框架的上下文中回答。
在前端管理复杂嵌套 SQL 关联的最佳实践是什么?
假设您有 post 并且评论和评论嵌套在 post 下。您将 post 作为 JSON 发送到前端,并在其下嵌套注释。现在您可以在每个 post 下列出它们,太棒了。但随之而来的问题是:
如果你也想显示最近的评论怎么办?您的评论服务需要在规范化集合中包含评论,或者以允许按日期排序的方式访问它们。
- 这是否意味着您单独 API 征集按日期排序的评论?这会在前端复制评论,并要求您在两个地方而不是一个地方更新它们(一个用于 posts,一个用于评论,假设可以编辑或更新评论)。
- 您是否实施了某种前端数据规范化?这意味着您有一个缓存层来保存嵌套数据,然后您将各个资源分配给它们相应的服务?
如果您的数据具有不同的嵌套级别怎么办?继续 post 和注释示例。如果您的评论可以回复到 10 级呢?
- 如果您单独 API 调用 post 和评论,这对您的数据模型有何影响?
- 如果您选择那种方法,这对您的缓存层有何影响?
如果我们不只是谈论 post 怎么办?如果您可以对照片和其他资源发表评论怎么办?
- 这对上述数据建模模式的两个选项有何影响?
脱离示例,如果我们谈论的是好友用户之间的递归关系怎么办?
我的初步想法和假设的解决方案
我最初的想法以及我将如何攻击它是使用缓存层并对数据进行规范化,以便:
- 缓存层处理任何必要的规范化
- 缓存层保存每个记录的 ONE 个规范表示
- 服务与缓存层通信以执行 CRUD 操作
- 服务通常不关心他们也不需要知道nested/complex数据模型是怎样的,当数据到达服务时它被规范化了
递归关系在某些时候需要是有限的,您不能永远继续嵌套。
这当然听起来不错,但我看到了很多潜在的陷阱,并希望获得更多见解。我发现很难将抽象的最佳实践与特定数据模型的具体解决方案分开。我很想知道其他人是如何解决这个问题的,以及他们将如何着手解决它。
谢谢!
我假设你会使用 restful apis,注意我不知道 rails 但我会建议你一些你可能会考虑的通用做法
假设您有一个页面显示 10 posts 和他们的 10 条评论按日期排序,在一次 api 调用
中实现此响应还有一页仅显示 5 post 秒,并且没有评论使用相同的 api 终点
使用一些查询参数使这成为可能。
尽量优化您的回复。
如果我们谈论 API这就是我的工作方式,您可以在任何编程语言中在一个端点有多种响应类型。
如果您的查询花费很多时间,并且该查询运行了多次,那么您当然需要缓存,但在每个 api 调用中谈论 10 post 秒不需要缓存。它应该不会对数据库造成影响。
对于嵌套问题,你可以有一种机制让它成为可能,即 我将获取 10 posts 和他们的所有评论,我可以发送一个查询参数,我想包含每个 post
的所有评论喜欢bar.com/api/v1/posts?include=comments
如果他们的评论我只需要一些自定义数据,我应该能够实现一些自定义包含。
喜欢bar.com/api/v1/posts?include=recent_comments
你API层,应该首先匹配你的自定义包含如果没有找到继续资源关系
用于更深入的参考,例如 comments.publisher 或 recent_comments.publisher 您的 API 层需要了解您目前正在使用哪种资源。普通包含不需要这个,但是自定义包含应该描述 model/resource 它们指向什么,这样就可以创建无限链
我不知道Rails,但如果你有一个强大的ORM/ODM
,你可以很容易地使这个模式成为可能有时,您也需要做一些过滤,这项工作也一样。
你可以有过滤器查询参数并实现一些自定义过滤器
即 bar.com/api/v1/posts?include=recent_comments&filters=favorites
或者忘记一切,在下面做点什么
bar.com/api/v1/posts?transformation=PageA
这将 return 10 个最近的 posts 以及他们最近的 10 个评论
bar.com/api/v1/posts?transformation=PageB
这将 return 只有 10 最近 posts
bar.com/api/v1/posts?transformation=PageC
这将 return 10 最近 post 和他们的所有评论