Пары ключ-значение в таблице SQL - PullRequest
0 голосов
/ 02 декабря 2018

Я создаю приложение Django и хотел бы показать некоторую статистику на главной странице, такую ​​как общее количество транзакций, процент успешных транзакций, ежедневное количество активных пользователей и т. Д.

Я нехочу вычислять эти значения в представлении каждый раз, когда пользователь запрашивает главную страницу по соображениям производительности.Я подумал о 2 возможных решениях.

(1) Создайте несколько таблиц с одной записью

Создайте таблицу для каждой статистики, например:

from django.db import models

class LastSuccessfulTransactionDate(models.Model):
    date = models.DateTimeField()

class TotalTransactionAmount(models.Model):
    total_amount = models.DecimalField(max_digits=8, decimal_places=2)

# ...

и убедитесь, что в каждой таблице существует только одна запись.

(2) Создайте таблицу с данными значения ключа

class Statistics(models.Model):
    key = models.CharField(max_length=100)
    value = models.TextField()

и сохраните данные, выполнив:

from datetime import datetime
from decimal import Decimal
import pickle

statistics = {
    'last_successful_transaction_date': datetime(2010, 2, 3),
    'total_transaction_amount': Decimal('1234.56'),
}
for k, v in statistics.items():
    try:
        s = Statistics.objects.get(key=k)
    except Statistics.DoesNotExist:
        s = Statistics(key=k)
    s.value = base64.b64encode(pickle.dumps(v, pickle.HIGHEST_PROTOCOL)).decode()
    s.save()

и извлеките по:

for s in Statistics.objects.all():
    k = s.key
    v = pickle.loads(base64.b64decode(s.value.encode()))
    print(k, v)

В обоих случаях данные будут время от времени обновляться заданием cron (они недолжен быть очень точным).

Для меня решение (2) выглядит лучше, потому что для отображения главной страницы мне нужно было бы получать данные только из таблицы Statistics, а не из числа из одной записистолы.Есть ли рекомендуемое решение этой проблемы?Спасибо

1 Ответ

0 голосов
/ 03 декабря 2018

Существует даже лучшее решение, если вы используете Postgresql, то есть JSONField .Вы можете напрямую сохранить пару ключ-значение в JSONField.Попробуйте вот так:

# model
class Statistics(models.Model):
    records = JSONField()

# usage
statistics = {
    'last_successful_transaction_date': datetime(2010, 2, 3),
    'total_transaction_amount': Decimal('1234.56'),
}

Statistics.objects.create(records=statistics)

Statistics.objects.filter(records__last_successful_transaction_date= datetime(2010, 2, 3))  # Running query

s = Statistics.objects.filter(records__last_successful_transaction_date= datetime(2010, 2, 3)).first()
new_statistics = {
    'last_successful_transaction_date': datetime(2012, 2, 3),
    'total_transaction_amount': Decimal('1234.50'),
}
records = s.records
records.update(new_statistics)
s.records = records
s.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...