powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / SIT (Single Table Inheritance) - небольшой интернет магазин.
6 сообщений из 6, страница 1 из 1
SIT (Single Table Inheritance) - небольшой интернет магазин.
    #37890333
alexandr.novitskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть проблемы такова:

В данный момент дописываю интернет магазин (компьютеры, комплектующие, портативные компы и тд).

К вопросу продумывания структуры базы подошел не совсем основательно, т.к. это первый более ни менее большой проект.
На начальном этапе, пока в базу добавлялись одни ноутбуки, нетбуки и тд, казалось бы, все нормально. Но вот дальшей встал вопрос о добавлении комплектухи и подобных товаров, т.к. у ноутбуков и им подобным кол-во аттрибутов (полей в таблице) ~24 + у каждого вида комплектующих еще по 5-6 уникальных для каждого вида аттрибутов, т.е. в процессе таблица должна расти в ширину, вроде и терпимо, но:

В поисках решения проблемы я отправился в интернеты. Ну и собственно для себя выделил два основных способа построения базы:



1) Single Table Inheritance (STI) - данная структура предполагает собой ОДНУ таблицу для всех товаров всех видов и, как я и предполагал, она будет рости в ширину и большинство полей в ней будет NULL-евыми. Вроде бы и кол-во товаров не должно превышать 5-6 тысяч ( по предварительным прогнозам ) т.е. таблица с примерно 40-50 полями и 5000-6000 строками без проблем будет возвращать нужные значения в считанные мгновения. И таки да, такая структура является реляционной БД, что для меня лично было откровением.

Тут в "админке" при добавлении товара в большую таблицу я просто указываю какие поля заполнять, остальные автоматом становятся NULL.



2)Entity-Attribute-Value (EAV) - предполагает собой разбиение товаров на три таблицы:

- Entity - Таблица, где хранится инфо о ВСЕХ товарах, но в виде 4-5 основных столбцов (одинаковых для всех). Таких как: id, навание, цена, производитель и тд.



-Attribute- хранит в себе весь список аттрибутов для каждого вида товара в виде (id_attribute, attr_value) т.е. получается довольно таки длинная таблица, как я понял. Если, допустим, будет 1000 ноутбуков по 15 уникальных параметров - это 15000 строк ( не так уж и много, но что есть то есть)



-Value- таблица, которая связывает Entity и Attribute внешними ключами, пары вида (id_product, id_attribute) т.е. размер ее будет чуть больше таблицы Attribute.



Итого: мы имеем разложенную по полочкам информацию о товаре, которая хранится "тупо" индексами в базе. Но, опять же, начитавшись в тырнетах выделил для себя следующие минусы этой структуры:



-Запросы будут ОЧЕНЬ(как по мне) большие. Чтобы вывести карточку товара нужно будет нехило натыкать INNER JOINов

-Сложность структуры, а в следствии и путаница возникает по части движка (оный пишу на PHP), опять все переделывать и тд.

-И вообще: стоит ли игра свеч ? При таком количестве товаров стоит ли извращаться таким образом ?


Лично я, больше склоняюсь к первому варианту, т.к. товаров, по сути, не очень много, как для интернет магазина. Ну и конечно число полей в таблице вряд ли превысит 50. А число записей 6000-7000.

Вот собственно что я хотел сказать и что спросить у умов программирования)

Спасибо за внимание!
...
Рейтинг: 0 / 0
SIT (Single Table Inheritance) - небольшой интернет магазин.
    #37890540
Рубероид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне кажется EAV правильно будет не так как у вас , а отдельно таблицу с описаниями атрибутов (id_attr, name, type и т.д.) и отдельно таблицу (id_tovar, id_attr, value)
...
Рейтинг: 0 / 0
SIT (Single Table Inheritance) - небольшой интернет магазин.
    #37890998
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К минусам EAV добавьте полное отсутствие ограничений (косяки, буде такие случатся увидят пользователи или что хуже вообще не увидят и не купят)
Дальше тормоза для выборки: строка достается не за раз, а за N раз (пусть и по индексу), где N количество атрибутов
Невозможность отдельных индексов.
и так далее.

Вы не заметили еще один вариант - общая таблица предок (не знаю как оно правильно называется) - то бишь все общие свойства всех товаров внесены в одну таблицу, а дочерние (связанные с основной как 1:1) содержат специфические детали
Код: sql
1.
2.
3.
4.
create table goods (good_id int primary key, descr varchar(200), price int)
create table computers (good_id int primary key references goods, computer_fields data)
create table printers (good_id int primary key references goods, printer_fields data)
create view v_computers as select * from goods g inner join computers c on g.good_id=c.good_id
...
Рейтинг: 0 / 0
SIT (Single Table Inheritance) - небольшой интернет магазин.
    #37891032
alexandr.novitskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое за ответы!

Да, действительно - не учел такой вариант!
Думал над чем-то подобным, когда есть главная таблица, goods(id,title,price,img) и есть таблица параметров, одна для всех товаров (id,id_good,par1,par2...), но это мне показалось теми же яйцами (STI) только в профиль).

Ваш вариант очень понравился )) Где-нибудь пробовали реализовать или видели реализации подобные ?
не будет проблем с фильтрацией и выборкой товаров ?
...
Рейтинг: 0 / 0
SIT (Single Table Inheritance) - небольшой интернет магазин.
    #37891500
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
те же яйца это будет вьюха
Код: sql
1.
2.
3.
4.
5.
create view all_goods as
select g.*,c.*,p.* .... from goods g
left join computers c on g.good_id=c.good_id
left join printers p on g.good_id=p.good_id
.....


alexandr.novitskiy не будет проблем с фильтрацией и выборкой товаровЕсли вы ТОЧНО знаете в какой таблице искать (то бишь ищете не во вьюхе которая выше) то найдется все.
...
Рейтинг: 0 / 0
SIT (Single Table Inheritance) - небольшой интернет магазин.
    #37891681
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexandr.novitskiy... число полей в таблице вряд ли превысит 50. А число записей 6000-7000.
Делай одну таблицу и непарься. Только предупреди клиента об ограничениях. А то ведь завтра они захотят пылесосами торговать или товарами секс индустрии ...
Вся проблема из-за того что сначала делаем а потом думаем. Попробуй в следующий раз поменять порядок действий. Практика показывает что лучше потратить лишнюю неделю на устаканивание вопросов, чем потом говорить - ОЙ.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / SIT (Single Table Inheritance) - небольшой интернет магазин.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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