Postgresql Hstore
Ранее я описал , как можно создавать динамические поля для продуктов, используя для этого паттерн EAV и решение с использованием MongoDb. Есть еще один способ с использованием расширения HSTORE для Postgresql.
Hstore - это расширение для PostgreSQl , который позволяет хранить данные в вида ключ - значение. То есть мы в одном поле можем хранить хеш в виде ключ и значение. Это лучше , чем хранить в текстовом поле сериализованный хэш , потому что Postgres позволяет создавать индексы на ключах нашего хэша. Подробнее об этом вы можете почитать здесь.
Создадим простой проект с продуктами , которые могут иметь произвольное количество полей. Для этого мы будем использовать django и замечательное расширение django-hstore.
Как устанавливать django я не буду здесь приводит.Вы можете это сделать посетив официальный сайт https://www.djangoproject.com/
Создаем новый проект
django-admin.py startproject shop_hstore<br>
Теперь мы создадим новое приложения под названием catalog
manage.py startapp catalog
До того пока мы не создали модели в приложении каталог , мы установим расширение django-hstore,
Устанавливаем django-hstore
pip install django-hstore
Теперь мы должны добавить django-store в INSTALLED_APPS в файле settings.py. Заодно мы добавим туда наше приложение catalog
INSTALLED_APPS = ( ... "django_hstore", "catalog", )
Кстати , дополнительные сведения по установке и по самому расширению вы можете посмотреть тут
Теперь настроим нашу базу данных. Так как мы используем POSTGRESQL , то мы должны активировать модуль hstore.
После того как мы активировали этот модуль , то теперь в файле settings.py настроим соединение:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'shop', 'USER': 'postgres', 'PASSWORD': 'postgres', 'HOST': '', 'PORT': '', }
Теперь создаем модель Product в файле catalog/models.py
from django.db import models from django_hstore import hstore class Product(models.Model): title = models.CharField(max_length=150) price = models.DecimalField(max_digits=7,decimal_places=2) attribute_data = hstore.DictionaryField() objects = hstore.HStoreManager() def __unicode__(self): return self.title
Здесь мы создали поле title и price и добавили поле attribute_data, который является key-value хранилищем , то есть поле hstore.