Доброго времени!
Возникла необходимость разработать сложный интернет-магазин. В упрощённом виде https://hoff.ru/ с небольшой нагрузкой, но со сложной структурой и интеграциями.
Сам я на Django что-то делаю уже давно, но все работы были достаточно простые (простая структура БД и отсутствие интеграций). Так как делать в основном всё самому, а опыта в сложных системах нет, то прежде всего ориентируюсь на свои знания и инструменты, чтобы не пришлось изучать слишком много нового и не растянуть сроки.
Критерии:
- Обойтись без дополнительного софта (sphinx/solr/redis и т.д.) на первом старте
- Обойтись на первом старте стандартной админкой djanga (возможно с небольшой кастомизацией)
- Реляционные БД. Опыт только с MySQL, но думаю и с PostgreSQL не возникнет проблем
Проблемное место - интеграции с 1с, но, как я понял, выбор паттерна БД не влияет на интеграцию с 1с, то этот вопрос решил отложить на потом (поправьте, если не прав).
Второе проблемное место – структура БД у товаров (атрибуты). Проблема популярна – неопределённое количество атрибутов, по которым нужна фильтрация. Я постарался изучить этот вопрос, и нашёл несколько решений:
1. EAV. Не очень хочется её выбирать, так как такое решение кажется не технологичным, к тому же, достаточно сложно реализовать на EAV юзерфрендли интерфейс админки. Другими словами, выбрал бы этот паттерн в последнею очередь.
2. Django-polymorphic. (одна таблица для общих атрибутов, и для каждого вида товара своя таблица с уникальными атрибутами)
Чтоб было понятно о чём я, привожу пример кода:
class Product(PolymorphicModel):
title = models.CharField("Название", max_length=255)
slug = models.SlugField("URL:", max_length=255)
class ComputerProduct(Product):
proc = models.CharField("Процессор", max_length=255)
memory = models.CharField("Память", max_length=255)
class ClockProduct(Product):
size = models.CharField("Размер", max_length=255)
Так как всё же, создать нужно не market.yandex.ru, а что-то попроще, и основные параметры товаров по которой нужна будет фильтрация ограничены, то такой паттерн может подойти. (что-то похожее увидел в Django-shop)
Но это привязывает клиента ко мне, любое добавление атрибута по которому нужна будет фильтрация потребует моей включенности. И достаточно много придётся проделать работы на старте, описав все модели и все группы фильтров с запросами (выйдет много кода и шаблонов). Этого хотелось бы избежать.
3. Hstore/jsonb
Неизвестные атрибуты работают через hstore/jsonb, это потребует PostgreSQL.
С этим ещё не работал, но из коробки Django поддерживает поиск по jsonb/hstore https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/fields/#django.contrib.postgres.fields.JSONField
Это решение должно дать больше гибкости, чем 2 вариант. По задумке должна быть отдельная модель, определяющий список характеристик товаров для категории, на основе которого строится:
И всё это должно работать на стандартной админке Django, а производительности PostgreSQL должно хватить для фильтрации без подключения всяких elasticsearch. Но всё это в теории, на практике под вопросом возможность строить динамически фильтр для категории и поля для продукта.
В рамках этого подхода не совсем понятно, как решать вопрос с конфигурацией товаров (например, выбор материала для столешницы, влияющая на стоимость). Но в общем-то, это можно решить средствами SQL/manytomany.
В общем, нужны советы и рекомендации как лучше решить задачу, я склоняюсь к 3 варианту, но хотелось бы поговорить с кем-то, кто уже подобное делал.