Python / Django: эмуляция многомерного слоя в базе данных MySQL - PullRequest
1 голос
/ 01 июня 2010

Я работаю над проектом Django, где мне нужно предоставить много разных визуализаций для одних и тех же данных (например, average of a value for each month, for each year / for a location и т. Д.).

Однажды в колледже я использовал базу данных OLAP, и я подумал, что она будет соответствовать моим потребностям, но, похоже, она слишком тяжелая для того, что мне нужно. На самом деле объем данных не очень большой, поэтому мне не нужна оптимизация, просто способ представить разные визуализации одних и тех же данных без необходимости писать 1000 раз один и тот же код.

Итак, подведем итог: мне нужна библиотека python:

  • для эмуляции многомерной базы данных (стиль OLAP был бы хорош, потому что я думаю, что это довольно удобно: структура звезды и все)
  • ненавязчив, потому что я не могу ничего изменить в существующей базе данных MySQL
  • простой в использовании, потому что в противном случае нет смысла заменять некоторые служебные данные другими.

Ответы [ 4 ]

2 голосов
/ 07 июня 2010

Хорошо ... Я наконец-то придумал собственное решение (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},
...     },
... }

Используйте пользовательские теги шаблонов и т. Д. *

1 голос
/ 01 июня 2010

Почему бы просто не использовать стандартные функции агрегирования ORM: http://docs.djangoproject.com/en/dev/topics/db/aggregation/

Где бы вы ни думали, что производительность станет хитом, вы можете денормализовать это поле.

0 голосов
/ 30 октября 2013

Существует также http://cubes.databrewery.org/. Легкий движок OLAP на питоне.

Он может работать поверх существующих схем баз данных, обеспечивает операции OLAP и прост в использовании.

0 голосов
/ 01 июня 2010

У вас есть словарь 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.
...