使用触发器与视图获取当前数据状态

时间:2013-03-07 07:45:43

标签: database-design triggers views database-trigger

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

使用的数据库: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(不是强制的,但可能的)包含级别和状态的所有组合。

示例:

名称:“King”可以保持等级1状态a,等级1状态b,......,等级2状态a,等级2状态b .....等级3状态a,等级3,状态b .....

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

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

    King在Level 1中有多少“状态a”。 King中1级有多​​少“状态b”。 King中1级有多​​少“状态c”。 King中1级有多​​少“状态d”。 对于King来说,在Level 2中有多少“状态a”。 等等......

    姓名---等级---状态

    国王--- 1 --- a

    国王--- 1 --- a

    国王--- 1 --- a

    国王--- 1 --- b

    国王--- 1 --- b

    国王--- 1 --- d

    等级为2级,然后也有不同的名称。我想要名为“King”

  2. 的1级计数

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

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

    我创建了表2:

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

    当更新原始表1时,触发器相应地增加计数。现在我直接从这张表2中读到。

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

    名称 - 电平 - 状态 - 计数

    King 1 a 3

    King 1 b 2

    King 2 a ...

    等等。

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

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

    谢谢, 拉朱

2 个答案:

答案 0 :(得分:0)

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

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

所以使用视图:数据库无论如何都必须执行所有查询。所以每次用户要求数据时我都会执行320次查询。

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

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

如果我的理解错误,请更正,我愿意学习。

谢谢, 拉朱

答案 1 :(得分:0)

  

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

是的,但您不需要执行单独的查询:您需要一个按namelevelstatus汇总COUNT的查询:

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

Find out more