【问题标题】:Using Triggers vs Views to get current data status使用触发器与视图获取当前数据状态
【发布时间】:2013-03-10 19:00:48
【问题描述】:

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

使用的数据库: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. 每个名称的每个级别的每个状态计数。例如:

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

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

    国王--- 1 --- a

    国王--- 1 --- a

    国王--- 1 --- a

    国王--- 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 a ...

等等。

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

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

谢谢, 拉朱

【问题讨论】:

  • 有人请告诉我触发器和视图之间可以使用什么来从父表中获取汇总数据?

标签: database-design triggers views database-trigger


【解决方案1】:

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

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

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

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

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

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

谢谢, 拉朱

【讨论】:

    【解决方案2】:

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

    是的,但您不需要执行单独的查询:您需要一个查询来聚合 COUNT by namelevelstatus

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

    Find out more

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-22
      • 2019-07-04
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2019-02-18
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多