powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Таблица товаров: одна на всех?
25 сообщений из 30, страница 1 из 2
Таблица товаров: одна на всех?
    #39556507
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.
Допустим, есть небольшое кафе или ресторанчик, предлагающее определенные товары посетителям.
И у разных категорий товаров есть некоторые специфичные параметры..

Для спиртных напитков предполагается использование следующих полей в таблице item:

item_volume // объем, мл
item_percent // крепость
item_vendor // производитель
item_origin // страна происхождения

Для, например, блюд поля будут примерно следующими:

item_name // название
item_weight // вес
item_contains // состав
item_type // первое блюдо, второе блюдо \ десерт

Ну и далее.. Сигареты, какая-нибудь газировка..

Также будет присутствовать таблица заказов, пусть orders, которая будет содержать внешние ключи на товары, их количество и т.п.

Меня интересует, как логически организовать таблицу товаров?
Все товары должны присутствовать в одной таблице, а их свойства (поля таблицы) будут смешаны (т.е. будет одна большая таблица item со свойствами всех товаров, большая часть из которых будет заполнена NULL'ом (или нулями, или еще чем-то?) )?

Или под логически разные категории товаров лучше создать отдельные таблицы? Тогда в таблице заказов будет бардачок - на каждую таблицу товаров ( на вино, на блюда, на сигареты и прочее ) надо будет сделать внешний ключ. И в каждом кортеже лишь один из них будет заполнен, остальные будут NULL ).

Как смешать несмешиваемое? :)

Таблицы и параметры я привел для примера, чтобы была понятна суть вопроса. Буду благодарен ответам (можно в общих чертах, а конкретизировать под свою БД я уже попытаюсь самостоятельно).
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556518
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameuserкак логически организовать таблицу товаров?
Вариант 1: разреженная таблица;
Вариант 2: EAV;
Вариант 3: сериализованное (напр. в JSON) поле свойств.
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556601
Дормедонт Евлампиевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант:
т. Свойства товаров
т. Категории товаров
т. Свойства категорий товаров (определяет набор свойств для разных категорий товаров) - опционально
т. Значения свойств
т. Товары

Если будут свойства типа список, то ещё:
т. Значения свойств типа список

и т.д.
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556602
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дормедонт ЕвлампиевичЕсли будут свойства типа список, то ещё:
т. Значения свойств типа списокНи в коем случае. Свойство товара не зависит от того, моно- оно или мульти- .
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556605
Дормедонт Евлампиевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaДормедонт ЕвлампиевичЕсли будут свойства типа список, то ещё:
т. Значения свойств типа списокНи в коем случае. Свойство товара не зависит от того, моно- оно или мульти- .

Если у нас есть свойство Цвет и варианты: Красный, Синий, Голубой.
Как правильно товару в свойство Цвет записать значение из этого списка?
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556647
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameuser
Как смешать несмешиваемое? :)


Наследование. Отношение подкатегории. Описано хорошо в документации по Hibernate , как ни странно (раздел
Также разновидность -- EAV.
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556710
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дормедонт ЕвлампиевичЕсли у нас есть свойство Цвет и варианты: Красный, Синий, Голубой.
Как правильно товару в свойство Цвет записать значение из этого списка?Ну как хранится в базе отношение много-ко-много? в таблице связи (ID товара - ID цвета), ясен пень...
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556754
Дормедонт Евлампиевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaДормедонт ЕвлампиевичЕсли у нас есть свойство Цвет и варианты: Красный, Синий, Голубой.
Как правильно товару в свойство Цвет записать значение из этого списка?Ну как хранится в базе отношение много-ко-много? в таблице связи (ID товара - ID цвета), ясен пень...

А где хранится ID цвета - цвет?
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556769
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дормедонт ЕвлампиевичА где хранится ID цвета - цвет?Ну как бы в таблице цветов, не?
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556773
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дормедонт Евлампиевич , или Вы к тому, что поле цвета сделать типом SET? Ну так опасно же... да, 64 цвета, пожалуй, не наберётся (хотя фиг знает...) - но сколько таких SET-полей получится? а на них все вместе (да плюс все ENUM) есть всего-то 255 значений на таблицу, не больше. Да и неудобно с ними работать...
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556827
Дормедонт Евлампиевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaДормедонт ЕвлампиевичА где хранится ID цвета - цвет?Ну как бы в таблице цветов, не?

Предполагалось, что значения всех свойств списочного типа будут храниться в одной таблице (ID-свойства, ID-значения, Значение)
Пример строки: 1 (ссылается на свойство - Цвет), 2, "Красный".

А лучше для каждого свойства списочного типа делать отдельную таблицу?
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556839
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дормедонт ЕвлампиевичПредполагалось, что значения всех свойств списочного типа будут храниться в одной таблице (ID-свойства, ID-значения, Значение)
Пример строки: 1 (ссылается на свойство - Цвет), 2, "Красный".
А если у тебя сто красных объектов - так и будет сто записей со значением "Красный"? где же тогда нормализация? и опять же - это получится прямой ввод, а как бороться с опечатками?
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556845
Дормедонт Евлампиевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaДормедонт ЕвлампиевичПредполагалось, что значения всех свойств списочного типа будут храниться в одной таблице (ID-свойства, ID-значения, Значение)
Пример строки: 1 (ссылается на свойство - Цвет), 2, "Красный".
А если у тебя сто красных объектов - так и будет сто записей со значением "Красный"? где же тогда нормализация? и опять же - это получится прямой ввод, а как бороться с опечатками?

можно в общей таблице связи, можно в разных..

т. Значения свойств (ID-товара, ID-свойства, Значение, Значение списочного типа)

Так плохо?
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556855
Дормедонт Евлампиевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот так -> т. Значения свойств (ID-товара, ID-свойства, Значение, ID-Значения списочного типа)
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556947
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну это обычный EAV.
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39556952
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было.

20785530
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39557949
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Было да сплыло.. Или я пропустил что-то, или та ветка застряла также, как и эта.

авторВариант 1: разреженная таблица;
Вариант 2: EAV;
Вариант 3: сериализованное (напр. в JSON) поле свойств.

1. Не нашел внятного объяснения разреженной таблицы. Эта таблица, в которой перечислены все свойства всех возможных товаров, при использовании которой большая часть свойств будет заполнена NULL'ами или нулями, а оставшаяся малая часть свойств, принадлежащих тому или иному товару, будет заполняться полезными значениями ?

2. Про EAV так и не смог вкурить.. Русских статей мало или я поленился детально вникнуть в этот вопрос. Набросок схемы представлен ниже.

3. Вариант интересный с JSON, но со свойствами надо работать (считать количество товаров в наличии, например, объем всех спиртных напитков).

________

Теперь про EAV или то, что получилось.
На моей картинке ниже есть центральная таблица goods, в которой перечисляются товары. Внешним ключом к ней служит ID категории товара из соседней таблицы справа. В свою очередь таблица категорий "раздает" свой внешний ключ на соседнюю таблицу параметров категории товара через связь один-ко-многим.

Примерно так:
Категория drinks - параметры volume, strenght ( крепость ), made_in, ...
Категория eatable - параметры weight, cooked_time ( время приготовления ), contains ( состав ) и пр.
Категория cigarettes - параметры brand_name, is_lights, country_origin и пр.

Есть корзина cart, которая соединяет used_id и goods_id, т.е. пользователя и выбранные этим пользователем товары.
Есть таблица заказов order с промежуточной таблицей order_contains, в которой перечислены включенные в заказ товары.

Осталось понять, как реализовать связь между товарами и свойствами категории, к которой этот товар принадлежит. Камень преткновения :) Есть идеи дальнейшего строительства таблиц?
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39557996
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameuser1. Не нашел внятного объяснения разреженной таблицы. Эта таблица, в которой перечислены все свойства всех возможных товаров, при использовании которой большая часть свойств будет заполнена NULL'ами или нулями, а оставшаяся малая часть свойств, принадлежащих тому или иному товару, будет заполняться полезными значениями ?
Именно так. Многие СУБД имеют специальные средства для хранения таких таблиц и работы с ними. На всякий случай - в ихних терминах это называется sparse table.

sameuserЕсть корзина cart, которая соединяет used_id и goods_id, т.е. пользователя и выбранные этим пользователем товары.Тут главное - не сделать ошибку. Товар в таблице товара - это шаблон типа. А товар в корзине покупателя - это экземпляр этого типа. Т.е. между таблицей товаров и конкретным товаром в корзине связи нет - шаблон товара копируется в корзину и становится самостоятельным экземпляром сущности. Хотя это и не мешает ему продолжать ссылаться в таблицу свойств.
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39558699
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что такое FLAT TABLE ? Кто-либо работал, сталкивался? Можете объяснить своими словами?
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39558700
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameuserЧто такое FLAT TABLE ?
А в каком аспекте?
Простейший случай трактовки термина тривиален.
Но возможно в вашем источнике под этим подразумевается что-то другое.
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39558701
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нашел, правда, не сразу..
Это тот же вариант с JSON, только в профиль..

автор Definition - What does Flat Database mean?

A flat database is a simple database system in which each database is represented as a single table in which all of the records are stored as single rows of data, which are separated by delimiters such as tabs or commas. The table is usually stored and physically represented as a simple text file.
https://www.techopedia.com/definition/25330/flat-database
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39558703
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FLAT TABLE и Flat Database это разные вещи.
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39558706
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Судя по всему, в рамках реляционной модели решить вопрос невозможно..
В любом варианта будет бардак с точки зрения "нормальности" БД.

sparsed table, она же "таблица, заполненная "null'-ами. Хранит массу пустых ключей и полей, в которые могут быть внесены ошибочные данные. С точки зрения логики этот вариант хромой, т.к. таблица содержит взаимоисключающие поля (например, крепость напитка и .. там.. не знаю... количество сигарет в пачке).

JSON-формат свойств товаров : по свойствам нужно пробегаться, работать с ними - сортировать по производителю, например.

EAV-модель: также не обеспечивает целостность данных. Таблица товаров - таблица свойств - таблица значений свойств. Но как быть, когда есть таблица производителей, например. Таблица значений свойств ( Value ) должна иметь внешний ключ из таблицы производителей, да и из других таблиц (как иначе обеспечить целостность? Вбить всех производителей в ENUM? А если товар, в отличие от большинства других товаров, не содержит данных о производителе? Например, это услуга какая-то).
Это уже дает бардак, приходим к пункту 1 - sparsed table

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

flat table - не удалось найти понятную информацию.. Но судя по той, что попадалась - этот вариант похож на использование JSON-сериализованных данных.

Не устраивает ни один из этих вариантов.
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39558713
sameuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все это - одни костыли.. я разочарован, узнав, что такой типичный бытовой кейс не решается средствами sql без извращений
...
Рейтинг: 0 / 0
Таблица товаров: одна на всех?
    #39558714
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sameuserвсе это - одни костыли.. я разочарован, узнав, что такой типичный бытовой кейс не решается средствами sql без извращений
Не, ну уважаемые люди сказали же
AkinaМногие СУБД имеют специальные средства для хранения таких таблиц и работы с ними. На всякий случай - в ихних терминах это называется sparse table.
.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Таблица товаров: одна на всех?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]