【发布时间】:2016-11-05 13:59:18
【问题描述】:
为了尽可能好地描述这个问题,我将详细说明实际情况: 该站点将允许用户添加 IP 以针对 RBL 监控他们。在此过程中,我一直在思考不同的方法来构建数据库,以尽可能优化大型 IP 块的效率,同时仍然可行。
该项目建立在 Laravel 之上,我已经建立了一个数据库结构,其中包含:
table_a
包含有关我们监控的 IP 的信息。
- id(汽车公司,主要)
- name (varchar, 128) 显示器的友好名称
- ip (varchar, 16) 要监控的 IP
- email (varchar, 128) 用于通知的电子邮件
- notifications (tinyint, 1) 通知开关
- 时间戳
-
table_b
包含有关我们监控的 RBL 的信息。
- id(汽车公司,主要)
- url (varchar, 255) 监视器的 URL
- active (tinyint, 1) 切换我们是否主动检查它
-
table_a_b
用于维护每个 RBL 状态的数据透视表。
- table_a_id (int, 10) table_a 上 id 的外键
- table_b_id (int, 10) table_b 上 id 的外键
- listed (tinyint, 1) IP 是否在此 RBL 中列出
- notified (tinyint, 1) 我们是否已经通知了用户
所以它目前的工作方式是在添加 IP 时,将 IP 添加到 table_a 中,并将(number of rows in table_b * number of IP's) 添加到数据透视表中。虽然添加它并不需要那么长时间 - 我看到的问题是添加 /24 个 IP(256 个 IP)跟踪(当前)87 个 RBL 会创建总计 22,272 条记录。那是一个/ 24。 A /22(1024 个 IP)将是 89,088 条记录。这对于单个用户来说是一个相当大的数量,我可以看到这会如何迅速破坏数据库性能。
我想到的另一种方法是在table_a 上保留一个名为listed_on 的列,这是它们在其中列出的任何RBL 的列表。该行将包含沿55|32|11 行的内容 - 这将足够简单以在 PHP 中解析。尽管如此,对于大量用户,我可以看到通过大量字符串处理来提高 PHP 性能。
我在这里错过了一个明显的解决方案,还是这两个(也许尤其是后者)是最好的选择?
干杯!
【问题讨论】:
-
@philipxy 因为它是数据透视表?它是管理 RBL 和 IP 之间关系的表。
标签: php mysql database laravel