gpt4 book ai didi

angularjs - 通过分组查询减少 http 请求量

转载 作者:可可西里 更新时间:2023-11-01 16:32:26 24 4
gpt4 key购买 nike

所以我的 Angular 1 应用程序中有一堆繁琐的 http 请求,这些请求阻碍了许多其他请求。假设我有一个来自完全不同的数据源的用户列表,我调用了 5 个不同的表,例如:

user.signup
+-----+------------+
| uid | date |
+-----+------------+
| 1 | 2016-12-13 |
| 2 | 2016-12-01 |
+-----+------------+
user.favourite_color
+-----+-------+
| uid | color |
+-----+-------+
| 1 | red |
| 5 | blue |
| 7 | green |
+-----+-------+
user.location
+-----+-----------+
| uid | location |
+-----+-----------+
| 2 | uk |
| 3 | france |
| 9 | greenland |
+-----+-----------+

它们在不同表中的原因是因为这些字段是可选的。在我看来,我有 3 个选择:

将它们放在一张表中

所以我可以将它们全部分组到一个表中并有一堆空列,但就数据库设计而言,这并不适合我。

+-----+------------+-----------+-------+
| uid | date | location | color |
+-----+------------+-----------+-------+
| 1 | 2016-12-13 | null | red |
| 2 | 2016-12-01 | uk | null |
| 3 | null | greenland | null |
| 5 | null | null | blue |
+-----+------------+-----------+-------+

通过 1 个请求将它们全部加入

所以我可以只有一个查询来连接所有这些表,但我认为它们必须完全连接,并期望某些表中不存在某些 uid。例如

+------+------------+-------+-----------+-------+-------+
| uid | date | l_uid | location | c_uid | color |
+------+------------+-------+-----------+-------+-------+
| 1 | 2016-12-13 | null | null | 1 | red |
| 2 | 2016-12-01 | 2 | uk | null | null |
| null | null | 3 | greenland | null | null |
| null | nul | null | null | 5 | blue |
+------+------------+-------+-----------+-------+-------+

这可能更糟!

更改请求的方式?

也许可以巧妙地改变请求的方式:

function activate() {
$q.all([requestSignupDate(), requestFaveColor(), requestLocation(), ....])
.then(function (data) {
//do a bunch of stuff with the data
});
}

我想改成:

function activate() {
requestUserData();
}

有什么建议吗?

最佳答案

这是一个典型的 ORM 问题 - 正是这个数据库没有提供将 user 存储为 entity 的更好方法。

实体属性分布在多个表中,由于是可选的,您需要对多个表进行左连接。

所以你必须首先从根本上解决这个问题。您有多个选项或(不知道要求的非选项。)

Put them in one table

如果您可以使用可为空的列并重构您的应用程序 - 这是更可取的。我看到您的其他表只有一两个字段。高度规范化的表可以节省一些空间,并且没有数据重复,其他规范化的好处也没有实际意义。

Join them all with 1 request

仅当您的查询保持高性能时。你可以使用 left join 吗?如果上述选项很困难,您会这样做。仅将其用作快速修复。

解决数据库问题的其他选项

  1. 如果可行,使用服务器端缓存。
  2. 如果可行,使用不同的 NoSQL 数据库(例如 MongoDB)

Change the way the requests are made?

您真的需要预先准备好所有属性吗?网络是异步的,所以为什么不保持异步。仅当您需要所有属性时才使用 $q.all。例如,用户甚至可能不会导航/滚动到页面的特定部分来查看内容,所以为什么首先会查询。

除此之外,您还可以将服务器端和数据库集群化,以便这些查询落在多台机器上并分散负载。您可能会并行检索一些项目。

如果列数是您拥有的所有列数并且表格是您提到的所有表格,即补充表格的属性较少,我会选择将它们放在 1 个表格中选项。

关于angularjs - 通过分组查询减少 http 请求量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41126131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com