【问题标题】:Python / Django : emulating a multidimensional layer on a MySQL databasePython / Django:在 MySQL 数据库上模拟多维层
【发布时间】:2010-06-01 12:09:35
【问题描述】:

我正在处理一个 Django 项目,我需要在相同的数据上提供许多不同的可视化(例如 average of a value for each month、for each year / for a location 等...)。

我曾经在大学里使用过 OLAP 数据库,我认为它可以满足我的需要,但它似乎对我的需要来说太重了。其实数据量不是很大,所以我不需要任何优化,只需要一种方式来呈现相同数据的不同可视化,而不必编写1000次相同的代码。

所以,回顾一下,我需要一个 python 库:

  • 模拟多维数据库(OLAP 风格会很好,因为我认为它很方便:星形结构,什么都有)
  • 非侵入式,因为我无法修改现有 MySQL 数据库上的任何内容
  • 易于使用,否则将一些开销替换为另一个开销是没有意义的。

【问题讨论】:

  • “对于我需要的东西来说太重了”没有多大意义。您将不得不详细说明为什么 SQL 数据库和星型模式“过于繁重”。
  • 也许我错了,但 OLAP 方法旨在设计数据仓库,即大量数据,其中更改分析数据的维度将花费大量时间。所以在这种情况下有某种缓存机制。我的意思是我只需要星型(或片状)结构模式的便利,而无需安装全新系统的开销......更清晰吗?

标签: python database django olap multidimensional-array


【解决方案1】:

好吧...我终于想出了自己的解决方案 (https://code.google.com/p/django-cube/),因为我找不到我想要的。

使用这样的模型:

class Instrument(models.Model):
    name = models.CharField(max_length=100)

class Musician(models.Model):
    firstname = models.CharField(max_length=100)
    instrument = models.ForeignKey(Instrument)

创建一个立方体:

>>> c = Cube(['instrument__name', 'firstname'], Musician.objects.all(), len)
... #Cube(dimensions, queryset, aggregation_function)
... #You can use the Django field-lookup syntax for dates and foreign keys !!!

沿一个(或多个)维度查询多维数据集:

>>> c.measure_dict('firstname', 'instrument__name', full=False) == {
...     'Miles': {
...         'trumpet': {'measure': 1},
...         'sax': {'measure': 0},
...         'piano': {'measure': 0},
...     },
...     'John': {
...         'trumpet': {'measure': 0},
...         'sax': {'measure': 1},
...         'piano': {'measure': 4},
...     },
... }

使用自定义模板标签等...

【讨论】:

  • 嗨 Sebpiq,你能用工具来处理这种情况吗?我之前尝试过使用 Django-Cube,但不是在这种情况下:stackoverflow.com/questions/9300922/…
  • @MridangAgarwalla:我发布了一个答案
【解决方案2】:

为什么不直接使用标准的 ORM 聚合函数:http://docs.djangoproject.com/en/dev/topics/db/aggregation/

无论您认为性能会受到什么影响,都可以对该字段进行非规范化。

【讨论】:

  • 不...用 Django Orm 编写所有这些统计计算非常痛苦。正如我所说,我不在乎性能。我只需要一种方便、强大且灵活的方法来计算我的数据的聚合。我已经尝试了很多,写了很多代码,django ORM显然不适合:这就是多维数据库的真正用途!
【解决方案3】:

你有 Python defaultdict 字典。

如果您的数据很小,只需查询所有数据并加载一堆字典,其中包含计数和总和等等。

“星型模式”只是穷人的倒排数据库,其中维度(即字典)引用行列表。您可以汇总这些行列表以创建汇总字典。

d1_sum= defaultdict( int )
d1_count= defaultdict( count )
d2_sum = defaultdict( int )
for row in MyFactTable.objects.all():
    d1_sum[row.attr1] += row.fact1
    d1_count[row.attr1] += 1
    d2_sum[row.attr2] += some_function( row.fact2 )
    etc.

【讨论】:

  • 嗨,谢谢你的回答,你是对的,但我决定开发自己的东西,因为我最终还是写了很多代码。你可能想看看:code.google.com/p/django-cube
【解决方案4】:

还有http://cubes.databrewery.org/。 python中的轻量级OLAP引擎。

它可以在现有的数据库模式之上工作,提供 OLAP 操作,并且易于使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2011-10-24
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多