通过对查询进行分组来减少http请求的数量

时间:2016-12-13 16:37:12

标签: angularjs http database-design

所以我在我的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个选择:

将它们放在1个表中

所以我可以将它们全部分组到一个表中,并且有一堆空列,但在数据库设计方面我并没有和我坐在一起。

+-----+------------+-----------+-------+
| 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个请求加入他们

所以我可以只有一个连接所有这些表的查询,但是我看到它们的方式必须是完全连接,期望某些表在某些表中不存在。 e.g。

+------+------------+-------+-----------+-------+-------+
| 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();
}

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

  

将它们放在一个表格中

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

  

通过1个请求加入所有

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

其他选项解决数据库问题

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

    更改请求的方式?

    您是否真的需要所有物业? Web是异步的,所以为什么不保持异步。仅在需要所有属性时才使用$q.all。例如,用户甚至可能无法导航/滚动到页面的某些部分以查看内容,因此可以在第一时间进行查询。

    除此之外,您还可以对服务器端和数据库进行集群,以便这些查询可以在多台计算机上进行,并且可以分配负载。您可以并行检索一些项目。

    如果您拥有的所有列数和表格都是您提到的,即补充表格中的属性较少,我将使用将它们放入1个表格选项。

答案 1 :(得分:0)

为什么不使用可空字段与您坐在一起? val line1 = """<row Id="85" PostTypeId="1"""" 存在是因为它很有用,并且具有固定字段集的可选值的配置文件表实际上是用于调用它的教科书案例。如果可以动态地重新定义字段(例如,换出“最喜欢的食物”的“最喜欢的颜色”),这是另一个故事,但这不是你所描述的要求。