Прежде всего, позвольте мне пояснить, что я не прошу ни о каком коде; Я просто не знаю общих идей/рекомендаций/мнений о том, как я могу реализовать то, что я собираюсь спросить.Сохранение, организация и запрос продуктов, опций/тегов и категорий
Я начинаю строить онлайн-систему электронной коммерции (Yii2 + MongoDB, так что PHP + NoSQL), и есть два реквизита, которые я не совсем уверен, как реализовать, не создавая огромный беспорядок в обоих мой код и базу данных.
Оба реквизита связаны, поэтому я объясню их как один.
Как и любая другая серьезная электронная коммерция, у нее были бы категории. А также, как и любая другая серьезная электронная коммерция, каждый продукт будет иметь tags
или options
. Позвольте мне немного пояснить, что я называю tags
/options
.
те доступные опции, которые пользователь может выбрать при покупке продукта, например, цвет или размер, материал и т.д.
- Категории
Там будет быть несколько general
категорий, а также других подкатегорий. Например, Electronics
может быть общей категорией, и подкатегории будут Computers
и Smart TVs
. Затем Motherboards
и RAM
могут быть подкатегориями Computers
.
Это само по себе может быть легко хранить в базе данных, но здесь идет проблема:
- Каждый продукт должен появиться при включении любой из категорий он принадлежит, или верхние категории. Это означает, что если я (как конечный пользователь) просмотрю все элементы в категории
Computers
, я должен увидетьNVIDIA GTX670
что принадлежит к подкатегорииGraphic cards
категорииComputers
.
, я мог бы спасти каждый продукт следующим образом:
{
_id: asdasfwetrw34tw34t245y45y,
name: "NVIDIA GTX670",
price: 99.50,
...
...
categories: [
"Electronics", //<-- just the ID of that group
"Computers", //<-- just the ID of that group
"Graphic cards" //<-- just the ID of that group
]
}
Но:
- Я не уверен, насколько быстро будет запрос для извлечения всех элементов определенной категории (и, конечно, элементы всех подкатегорий).
- Я не уверен, что еще минусы этого метода имеют, поэтому, пожалуйста, не стесняйтесь рекомендовать любую альтернативную схему для ее хранения.
2. Метки/опции
Это где настоящая головная боль.
Каждый вариант может принадлежать 0 или более категорий и подкатегорий, поэтому категория Woman fashion
может иметь параметры size
и color
, но категория Sunglasses
(подкатегории Woman fashion
) может иметь только color
, или даже другой набор параметров, полностью отличается от Woman fashion
.
Кроме того, значения внутри каждого варианта (red
, green
, blue
в опции color
) может появиться в случайных категорий. Таким образом, Woman fashion
будет иметь цвета, такие как Strawberry Red
и Tangerine
, тогда как Cars
будет иметь Carbon
и Black metallic
.
Кроме того, было бы несколько типов вариантов:.
- Полностью статический (как
size
, который может быть толькоS
илиM
, но никогда и в любом случае администратор не сможет напишите пользовательский размер, напримерKind of small
; он сможет просто выбрать, что уже есть в базе данных). - Статический, который может комбинировать (например,
colors
, который может бытьred
илиgreen
или комбинация цветов, которые выбирает администратор). - Свободного вход (как
dimensions
илиweight
, которые, в идеале, быть поле ввода и значения выпадающих присоединиться К примеру[10]
|.(mg||kg|tons)
или[20]
(cm|m|km|miles)
).
Я мог бы сохранить каждый вариант, как это:
{
option: "Color",
type: "Static with combinations"
values: [
{
value: "Red",
categories: [
"Sunglasses"
]
},
{
value: "Green",
categories: [
"Sunglasses",
"T-Shirts"
]
},
{
value: "Black metallic",
categories: [
"Cars"
]
}
],
categories: [
"Woman fashion", //<-- only the ID of this group
"Cars" //<-- only the ID of this group
]
}
Но я беспокоюсь о том, как большой один вариант может оказаться, когда есть 30 категорий и каждое значение опции устанавливается в случайных категориях.
Также я просто не вижу его достаточно чистым, но, возможно, это только я.
В любом случае, как и в предыдущем пункте, не стесняйтесь предлагать что-либо, что может придумать, я буду очень признателен за любые отзывы, которые вы можете мне дать.
Это огромный ответ! Сейчас здесь 3 часа, так что дайте мне несколько часов, чтобы я мог поспать, а затем я прочитаю и ответю;) – alexandernst
Конечно, не торопитесь :) – yaoxing
Я люблю часть! Я так и не думал об этом. О методах 'inheritance', я не уверен, что это сработает в моем случае. Клиент - это человек, который может передумать 84 раза в минуту. Кроме того, я боюсь, что у меня будут цвета, которые я не хочу появляться в некоторых категориях, но я хочу их в других («Автомобили против одежды»). Преобразование единиц является хорошим моментом, я буду помнить об этом! Спасибо за длинный ответ! kudos;) – alexandernst