mikifus/ci_olap

CodeIgniter 的 OLAP 库。

dev-master 2017-03-09 10:04 UTC

This package is not auto-updated.

Last update: 2024-10-02 09:52:42 UTC


README

用于 CodeIgniter 收集和读取星型模型统计数据的实验性 PHP 库。

该库的目的是以排序和优化的方式收集统计信息,以建立多维“立方体”。这种格式允许对数据进行切片、切块和钻取。

技术

需要 PHP 5.3+。目前,它只提供对 PostgreSQL 数据库的支持。存储过程和数据库函数是库行为的关键,因为数据由数据库转换(E-LT)。

安装

使用 Composer 或将源代码添加到您的项目中。

设置

实现分为三个步骤。

1. 准备配置文件

配置文件位于 "src/config/olap.php",必须添加到您的 CodeIgniter 应用程序文件夹的配置文件夹中。'立方体' 数组是您可能关注的第一点。

在设置立方体后,您可以添加一些维度。那些

在这一点上,我想提醒您注意文件末尾设置的某些前缀字符串。这些仅是为了使数据库看起来更美观并避免表名冲突的装饰性元素。如果您想的话,可以将其留空。如果您使用 PostgreSQL,则可能希望为这些表设置一个模式,而不是使用前缀。

2. 准备数据库

在这里,您可能需要一些关于存储过程的先进知识。原因是性能,但同时也因为封装以及因为它大大简化了库的 PHP 部分。

您可以将 src/sql 文件夹中的示例文件作为参考。只需看看配置文件和 sql 文件名是如何相关的。不仅存储过程,视图也可以让您操纵数据以实现魔法。

3. 实现

这取决于您如何做。请仔细查看 Olap.php 文件及其方法,以了解如何使用它。它使用两个方法非常简单:添加和查询。“添加”将数据插入到数据库中,“查询”读取它。

您可以通过这种方式实例化库

// $this->db is a CodeIgniter database object
$olap = new \Olap\Olap( $this->db );

或者甚至创建一个 CodeIgniter 库脚本,保持其美观

$this->load->library('olap', array( 'db' => $this->db ));

立方体

查看 example_config.php 文件。在这个例子中,您有一个可以工作的立方体。立方体主要包含四个组件:事实、视图、度量标准和维度。

这些组件的名称和描述必须代表数据库表及其列,以及维度的行为(稍后会更详细地介绍)。

示例事实表可能如下所示

CREATE TABLE olap_f_sale (
    price    INT NOT NULL,
    shop     INT NOT NULL,
    product  INT NOT NULL,
    time     INT NOT NULL,
);

事实

事实被定义为要存储在数据库中的事件。在示例中,我们存储 'sales'。这个字符串将被用作数据库表名,带上它的前缀,请注意这一点。

视图

库从数据库表或视图中收集数据,您可以在此处指定可用的视图。如果未指定表或视图,则库不允许访问。

您将在请求数据时使用视图作为参数。

度量标准

度量标准必须是事实表中的数值列。度量是关于该事实感兴趣的数字。在这种情况下,每次销售的金额。您可以添加任意多的度量标准,只需记住度量标准必须与同一事件中的其他度量标准相关。

此外,该库允许您使用度量值进行查询。您可以按等于x、高于x、介于x和y等值来切片数据。

例如,在这种情况下,您可以添加一个“税收”度量,如果每次销售有不同的税率,那么您可以稍后使用干净的数据进行操作。或者甚至只计算x%税率的销售。

维度

这里事情变得复杂。我们的立方体可以有很多维度,甚至超过3个,这就是为什么实际上它是一个超立方体。维度不仅仅是数值,它们可以是与事实相关的任何东西。您可以按维度值查询,或用它们对数据进行排序,或对它们进行计数,就像度量一样。

您可以选择使用实际数据库值,这些值可以在以后用于连接表或任何任意值。

维度可以有一个层次结构,其中它们通过一对多关系相互连接。这必须在配置文件中的维度数据中指定。

在我们的示例中,维度是按其ID存储的商店和产品。我们可以添加更多,如客户ID、产品颜色等。

等等!那个“时间”字符串是什么意思?继续阅读。

维度层次结构

维度层次结构可以在配置文件定义中建立。只需在当前维度下添加一个维度列表。尽量不创建递归关系,并记住它们只能是一对多,否则它们就不是层次结构。

在示例文件中,'时间'预设由一组四个维度组成。这里的层次结构非常清晰。一个常见的例子是使用位置信息,因此层次结构可能是这样的:行星 > 国家 > 地区 > 城市。

维度统一字段

这可能是最令人困惑的功能。有时候您不想通过小块引入数据。实际上您会这样做,但通过存储过程。

数据库有函数可以提取和操作数据,甚至比PHP有更好的性能,因此使用SQL函数而不是在PHP中连接参数来分割数据是有趣的。

在我们的示例中,您可以看到“时间”是一个统一字段,这意味着您可以只发送时间戳而不是通过部分发送日期。另一个有趣的添加是地理坐标的统一字段,特别适用于与PostGIS结合使用。