我是数据库设计的新手,我有关于为我的项目选择触发器与视图的问题。以下是一些细节:
使用的数据库: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)向用户显示它们。我需要的计算是......
每个名称的每个级别的每个状态的计数。例如:
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”
如果我执行单独的查询来获取此数据,如果我有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行(使用我的前端),用户可以是任何数字。请建议。
谢谢, 拉朱
答案 0 :(得分:0)
最后我做了一些研究并选择使用触发器。原因如下:
需要:需要在用户想要的时候获得汇总数据。目前,对于20个不同的名称,每次用户请求数据时我需要执行320个查询。所以这里的重点是用户要求数据的次数。在我的申请中,他经常要求。
所以使用视图:数据库无论如何都必须执行所有查询。所以每次用户要求数据时我都会执行320次查询。
使用触发器:我需要为每个行更新执行一次更新查询,这将为每次更新执行大约2次查询。我最多有2000行,当用户更新所有行时,我最终会执行4000次查询。但是当每次用户需要数据时,我只执行1个查询来获取所有数据。这样,将负载放在DB上的用户(单个或多个)因素已被最小化。
我在网上发现了许多关于触发器与视图的讨论,这些讨论偏向于不使用一件事,但我了解到,只要应用程序保持其可扩展性而不会大幅增加数据库的负载,就可以使用任何东西。由于DB上的负载是某些(x)因子用户的使用,因此该“some(x)”应保持尽可能小。
如果我的理解错误,请更正,我愿意学习。
谢谢, 拉朱
答案 1 :(得分:0)
“如果我执行单独的查询来获取此数据,我需要执行320 查询我是否有20个名字。 “
是的,但您不需要执行单独的查询:您需要一个按name
,level
和status
汇总COUNT的查询:
select name, level, status, count(*)
from your_table
group by name, level, status