后端如何与 Angular 网络应用多用户一起工作

How back-end works with an Angular web app multi user

我是一名 Angular 程序员,我正在接近后端世界。我很想知道,通过 JWT 管理多个用户的应用程序的后端是如何工作的。当我必须使用 angular 从数据库中检索某些内容时非常简单,因为它足以创建一个服务,我在其中输入 url 的 rest-api... 但是发生了什么当你有很多用户时的后端? 假设我有一个带有身份验证的 Web 应用程序,一个带有日期的 TODO 列表。我想在数据库中将有一个包含所有用户的列表。但是,如果用户使用表单添加事件和日期,它会如何工作?您创建一个 DB table 'events',每个用户一个?还是包含所有用户的所有事件的大 'event' table?

在您描述的场景中,您通常会有一个 "event" table 包含所有用户的事件。但是,table 也会有一列包含创建该事件的用户的 ID。

当显示登录用户的事件时,您首先要验证 JWT 令牌是否有效(请注意,即使此验证发生在客户端,也必须发生在服务器端,出于安全原因)。如果令牌有效,您将从令牌声明中检索用户 ID。然后,您将在数据库查询中使用此 ID,以便仅检索属于已登录用户的事件。

您的问题与 Angular 无关,甚至与后端服务无关,因此我将忽略该部分。所以你问的是设计多租户数据存储。

You create a DB table 'events', one for each user? Or a big 'event' table which contains ALL events of all users?

这里没有对错之分。这完全取决于您的需求。通常,这是简单性和隔离性之间的权衡。如果你谈论关系数据库(我从你的措辞中得到它是),那么你可以为每个租户有一个单独的数据库,或者为每个租户有一个单独的模式,或者一个带有索引列的 table。你甚至可以为每个租户做一个单独的服务器。都是可行的选择。单独的数据库选项是最孤立的,但更难编程。单个 table 更容易,但数据存储是共享的。我可以说我曾与客户合作设计此类解决方案,大多数时候他们为每个用户选择一个单独的数据库。

我建议阅读 this 文章,该文章讨论了 SQL 中的多租户数据 服务器(但是也适用于其他关系数据库)。它已有 10 年历史,但仍然非常相关。

当然,这个决定也会受到您的数据存储的影响。如果您不使用 RDBMS,那么您将有不同的概念和功能来组织数据,例如:集合、角色、文件夹、容器等。 此外 - 一些数据存储具有内置工具来处理这些要求。例如 - Azure SQL 数据库有一个名为 Row Level Security which makes it easier to manage a single table with a tenant identification column. It also has a concept called Elastic DB Pool and Elastic DB Tools 的功能,用于管理每个租户单独数据库的场景。 我确信其他 products\technologies 具有类似的功能,但这些只是帮助我说明问题的示例。