Php 一种更有效的数据透视数据库结构方法
为了尽可能好地描述这个问题,我将详细描述实际场景: 该网站将允许用户添加IP,以便根据RBL对其进行监控。在这样做的过程中,我一直在考虑不同的方法来构建数据库,以尽可能优化大型IP块的效率,同时仍然可行 该项目基于Laravel,我已经建立了一个数据库结构,其中包含: 表a 包含有关我们监视的IP的信息Php 一种更有效的数据透视数据库结构方法,php,mysql,database,laravel,Php,Mysql,Database,Laravel,为了尽可能好地描述这个问题,我将详细描述实际场景: 该网站将允许用户添加IP,以便根据RBL对其进行监控。在这样做的过程中,我一直在考虑不同的方法来构建数据库,以尽可能优化大型IP块的效率,同时仍然可行 该项目基于Laravel,我已经建立了一个数据库结构,其中包含: 表a 包含有关我们监视的IP的信息 id(汽车公司,主要) 名称(varchar,128)监视器的友好名称 ip(varchar,16)要监视的ip 电子邮件(varchar,128)通知电子邮件 通知(tinyint,1)通知
- id(汽车公司,主要)
- 名称(varchar,128)监视器的友好名称
- ip(varchar,16)要监视的ip
- 电子邮件(varchar,128)通知电子邮件
- 通知(tinyint,1)通知切换
- 时间戳
- id(汽车公司,主要)
- url(varchar,255)监视器的url
- 活动(tinyint,1)切换我们是否主动检查它
- 表a_id(int,10)表a上id的外键
- table_b_id(int,10)表_b上id的外键
- 已列出(tinyint,1)无论该IP是否列在此RBL上
- 已通知(tinyint,1)无论我们是否已通知用户
(表b中的行数*IP数)
添加到透视表中。虽然添加并不需要那么长时间,但我看到的问题是,添加针对(目前)87个RBL跟踪的IP(256个IP)中的a/24会创建总计22272条记录。那是a/24的。A/22(1024个IP)将是89088条记录。对于单个用户来说,这是一个相当大的数目,我可以看出这将如何快速破坏数据库性能
我想到的另一种选择是在表a
上保留一个名为的列,该列是它们所列的任何RBL的列表。该行将包含沿55 | 32 | 11
行的内容,这将非常简单,可以用PHP进行解析。尽管如此,对于大量的用户,我可以看到,用大量的字符串处理来提高PHP的性能
我是否错过了一个显而易见的解决方案,或者这两个(尤其是后者)是最佳选择
干杯 直接的关系设计(而不是表a\u b(ip,rbl,…)
)是表列出的(ip,rbl)
“ip ip列在rbl rbl上”和通知的(ip,rbl)
“已通知用户ip列在rbl rbl上”。关系表用于保存从某个特定于表的谓词(由列参数化的语句模板)生成真正命题(语句)的行。对于一个或多个列,每个可能的值都应该包含一行的表很少出现
相反,是否应该使用组合这些表的设计取决于谓词以及将它们应用于可能出现的所有情况所遵循的约束。例如,如果通知只发生在列出的IP-RBL对上,那么最好是IP\u RBL(IP,RBL,notified)
“IP在RBL RBL中,通知的是用户是否收到通知”。(这里的折衷是更小的表和更多的连接,而不是更小的表和更多的搜索。)
与未插入的数据相比,PS Pivot表通常不适合操作和查询数据。它们可以适用于格式化最终输出或在数据和元数据之间移动。看见(我看到您的pivot表未激活,因为布尔列名不是数据值,即使它是IP-RBL上的总计表。)@philipxy,因为它是pivot表?这是管理RBL和IP之间关系的表。这太简单了,我很生气,我自己也没想到。将其拆分为一个单独的轴心,在这里我只附加列出的IP,这当然是一个很好的方法,可以最大限度地减少行数。干得好,先生,我衷心感谢你是我们两人中合乎逻辑的一个!你们提出这个问题似乎表明了我们两人在观点上的偏见——你们支持透视表,只看到透视设计,我支持未透视表,不认为表是透视的,而只看到未透视的。