- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
为了尽可能描述问题,我将详细说明实际情况:该网站将允许用户添加 IP,以便根据 RBL 监控他们。在这样做的过程中,我一直在思考不同的方法来构建数据库,以尽可能优化大型 IP block 的效率,同时仍然可行。
该项目是建立在 Laravel 上的,我已经建立了一个数据库结构,其中包含:
table_a
Contains information about the IP we monitor.
- id (auto inc, primary)
- name (varchar, 128) Friendly name for the monitor
- ip (varchar, 16) The IP to monitor
- email (varchar, 128) An e-mail for notifications
- notifications (tinyint, 1) A toggle for notifications
- timestamps
-
table_b
Contains information about the RBL's we monitor against.
- id (auto inc, primary)
- url (varchar, 255) The URL for the monitor
- active (tinyint, 1) Toggle for whether we actively check toward it or not
-
table_a_b
A pivot table to maintain the status of each RBL in.
- table_a_id (int, 10) Foreign key to id on table_a
- table_b_id (int, 10) Foreign key to id on table_b
- listed (tinyint, 1) Whether or not the IP is listed on this RBL
- notified (tinyint, 1) Whether or not we've already notified the user
所以它目前的工作方式是,当添加一个 IP 时,它会将 IP 添加到 table_a 以及 (table_b 中的行数 * IP 的数量)
进入数据透视表。虽然添加它并不需要那么长时间 - 我看到的问题是添加/24 的 IP(256 个 IP)跟踪(当前)87 个 RBL 创建了总计 22,272 条记录。那是一个/24。/22(1024 个 IP)将是 89,088 条记录。对于单个用户来说,这是一个相当大的数量,我可以看到这将如何迅速破坏数据库性能。
我想到的另一种方法是在 table_a
上保留一个名为 listed_on
的列,它是其中列出的任何 RBL 的列表。该行将包含一些内容沿着 55|32|11
行——这很简单,可以在 PHP 中进行解析。尽管如此,对于大量的用户,我可以看到通过大量的字符串处理来降低 PHP 性能。
我是否错过了一个明显的解决方案,或者这两个(也许尤其是后者)是最好的选择?
干杯!
最佳答案
直接关系设计(而不是 table_a_b(ip, rbl, ...)
)是表 listed(ip, rbl)
"ip IP is listed on rbl RBL”和notified(ip, rbl)
“用户已被告知 ip IP 已列在 rbl RBL 上”。关系表旨在保存来自某些表特定谓词(由列参数化的句子模板)的真实命题(陈述)的行。很少有表格应包含一列或多列的每个可能值的行。
是否应该使用组合这些表的设计取决于您的谓词以及将它们应用于所有可能出现的情况所遵循的约束。例如,如果通知只发生在列出的 IP-RBL 对上,那么最好的可能是 ip_rbl(ip, rbl, notified)
“ip IP 在 rbl RBL 中,NOTIFIED 是用户是否已被通知”。 (这里的权衡是更多的小表和更多的连接与更少的大表和更多的搜索。)
与非透视数据相比,PS 透视表通常不是操作和查询数据的最佳选择。它们适用于格式化最终输出给人类或在数据和元数据之间移动。参见 this news post . (我看到你的数据透视表是未透视的,因为 bool 列名不是数据值,即使它是 IP-RBL 上的总表。)
关于php - 一种更有效的为枢轴构建数据库的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38174500/
我有一个与这个非常相似的问题: How to pivot a MySQL entity-attribute-value schema 或者这个 Enumerating combinations via
我在 postgresql-11 中使用 crosstab() 时遇到问题。 这是我的 table , CREATE TABLE monitor(tz timestamptz, level int,
我目前正在使用 ViewPropertyAnimators 来缩放 ImageView。然而,问题是图像总是从中心向外缩放,当我希望它从最左边缩放并向右缩放时。似乎没有枢轴方法。我还有其他方法可以做到
问题 1:我有一个具有以下结构和数据的表: app_id transaction_id mobile_no node_id customer_attribute entered_value
import numpy as np import pandas as pd data = {'experiment_name': ['exp1', 'exp1', 'exp1', 'exp1', '
我正在构建一个包含多个跟踪器的系统,这些跟踪器将使用许多相同的列,因此当用户插入跟踪器时,有一个用于跟踪器的表、跟踪器列,然后是哪些列与哪个跟踪器搭配的交叉引用row 不同的列值存储在共享相同记录 I
我有一个数据帧,其中有几个变量(此处为 Var1 和 Var2),这些变量在不同位置(此处为 Station)是不同的。然后我有一定数量的案例,对于每个案例,我在每个位置都会得到不同的值。 例如: n
我们正在开发 C# 应用程序,我们一直在使用 Linq to SQL 或标准 ADO(当需要性能时)与 SQL Server 一起工作。 我们有一个这样布置的表: 客户 ID、年/月、产品名称、数量
如何在 UWP 上创建一个枢轴,如果选中标题选项卡上的按钮,它将导航到其他页面?以及如何在标题选项卡上使用图像?例如在下图中,如果选择选项卡标题“Store”,它将导航到“Store”页面。 我试过搜
开始了解它的所谓的枢轴,但无法在没有聚合的情况下获得 sqlite 的示例。 架构: Readonly Table foos(_id, foo) (10 max records) Readonly T
我在 postgres 中有一个表(这是查询的结果),它有一组行(复杂的数据求和的结果),如下所示:(列名是每一天的名称, 每列的值都是 double 。) 周日周一周二周三周四周五 1.24 1.1
我已经学习和练习 sql 大约 6 个月了。我已经准备好投入其中,只是承认我对此很愚蠢,而且我的大脑无法理解它的大部分模式。我正在尝试创建一个数据透视表。关于这个主题的简单文献并不多,我找到的一个来源
我有一些模仿以下结构的数据: rdd = sc.parallelize( [ (0,1), (0,5), (0,3), (1,2
我有一个如下所示的数据框: id Revenue Cost qty time 0 A 400 50 2 1 1 A
我正在使用 Laravel 4 构建应用程序,但偶然发现了数据透视表的问题。 我有一个用户模型、一个建立模型和一个 StudyLevel 模型。 目前,为了找到用户所在的位置,我在用户模型中使用了以下
https://databricks.com/blog/2016/02/09/reshaping-data-with-pivot-in-apache-spark.html很好地解释了一个枢轴如何为 S
我正在尝试使用 Python 为一些时间序列建模准备数据Pandas (第一个计时器)。我的 DataFrame看起来像这样: df = pd.DataFrame({ 'time': [0,
我想转换以下 Pandas 数据框 a b 0 1 2 1 1 5 2 2 4 3 1 3 4 3 7 5 2 1 到 0 1
我要获取相对于 DisplayObject 的 anchor 例子: // HOW GET THIS VALUES IN CODE Object height = 90px Objec
所以我有这个 DF: In [130]: dfAbr Out[130]: ip ospfArea router_name 0 1.1.1.1 0.0.0.2 Rou
我是一名优秀的程序员,十分优秀!