0

我是数据库设计的新手,我有一个关于为我的项目选择触发器与视图的问题。以下是一些细节:

使用的数据库:MySQL

Table 1:

Name: - no limit on number of values
Level: - four values are possible - 1,2,3,4
Status: - four values are possible - a,b,c,d

每个名称 CAN(不是强制性的,但可能)包含级别和状态的所有组合。

例子:

名称:“王”可持有1级状态a、1级状态b、......、2级状态a、2级状态b..... 3级状态a、3级、状态b...... ..

现在我必须查询数据库以进行一些计算,以通过在网络上工作的 GUI(Java Swing)向用户显示它们。我需要的计算是......

  1. 每个名称的每个级别的每个状态的计数。例如:

    King 的 1 级中有多少“状态 a”。King 的级别 1 中有多少“状态 b”。King 的级别 1 中有多少“状态 c”。国王级别 1 中有多少“状态 d”。King 的 2 级中有多少“状态 a”。很快....

    名称---级别---状态

    国王--- 1 --- 一个

    国王--- 1 --- 一个

    国王--- 1 --- 一个

    国王--- 1 --- b

    国王--- 1 --- b

    国王--- 1 --- d

    以此类推 2 级,然后还有不同的名称。我想计算 1 级的名字“King”

如果我执行单独的查询来获取这些数据,如果我有 20 个名字,我需要执行 320 个查询。我不想。我这里有两个解决方案...

解决方案 1. 我创建了一个触发器。

我创建了表 2:

   Name,Level,a_count,b_count,c_count,d_count
   King  1       3      2      0         0
    xyz   1       ...    ..... ....       ...

当原始表 1 更新时,触发器会相应地添加到计数中。现在我直接从这个table2中读取。

解决方案 2:创建一个显示此数据的视图。

名称--级别--状态--计数

国王 1 a 3

国王 1 b 2

国王2一...

很快。

有了这个解决方案,我不需要一直通过网络发送所有查询。我可以只调用一次视图(它确实会执行所有查询,但不需要从程序中执行)

我可以实现两者,但我想知道哪种解决方案更有效。我将为每个用户(使用我的前端)在父表中保留大约 2000 行,并且用户可以是任意数字。请建议。

谢谢,拉朱

4

2 回答 2

0

“如果我执行单独的查询来获取这些数据,如果我有 20 个名字,我需要执行 320 个查询。”

是的,但您不需要执行单独的查询:您需要一个查询来聚合COUNTname和:levelstatus

select name, level, status, count(*)
from your_table
group by name, level, status

了解更多

于 2013-03-10T11:00:48.703 回答
0

最后我做了更多的研究并选择使用触发器。原因如下:

需要:需要在用户想要的时候获取汇总数据。目前对于 20 个不同的名称,每次用户请求数据时我都需要执行 320 个查询。所以这里的重点是用户请求数据的次数。在我的申请中,他经常要求。

所以对于视图:数据库无论如何都必须执行所有查询。所以每次用户请求数据时,我最终都会执行 320 次查询。

使用触发器:我需要为每个行更新执行一个更新查询,这将为每个更新执行大约 2 个查询。我最多有 2000 行,当用户更新所有行时,我最终会执行 4000 个查询。但是当每次用户需要数据时,我只执行 1 个查询来获取所有数据。这样,对数据库施加负载的用户(单个或多个)因素已被最小化。

我在网上发现了许多比较触发器与视图的讨论,这些讨论偏向于不使用一件事,但我了解到,只要应用程序保持其可伸缩性而不大幅增加数据库的负载,任何东西都可以使用。由于数据库上的负载是一些(x)因素用户的使用,这个“一些(x)”应该保持尽可能小。

如果我的理解有误请指正,愿意学习。

谢谢,拉朱

于 2013-03-08T07:39:52.367 回答