Реализация каталога товаров: MyISAM vs InnoDB

Panchous

Павел
Реализация каталога товаров: MyISAM vs InnoDB

Стоит задача реализации каталога товаров для сайта.
Каталог представляет собой две таблицы:
1. Категории с любым уровнем вложения (дерево)
2. Товары отдельной категории
Вопрос собственно в следующем: какой тип таблицы удобнее будет использовать (различие между ними мне известны)?

Почему возник такой вопрос.

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

Как быть с ней? Писать свою процедуру удаления?
(тогда теряется смысл внешних ключей)

И (тогда уж...) как вообще правильно реализовывать подобный модуль с наименьшими для себя трудозатратами?

Прошу совета.
 

Кром

Новичок
>(тогда теряется смысл внешних ключей)

Если тебе так хочется, чтобы за целостность данных отвечала только база, положи картинки в базу. При первом обращении к картинке копируй ее на диск, в какую нибудь директорию, которую можно чистить раз в неделю/месяц.
 

Panchous

Павел
картинки в базе хранить не хочется из соображений производительности.
Кроме того, товаров будет много, а размер БД ограничен хостером (все картинки не уместятся точно)

выходит, в данной ситуации уместнее пользовать MyISAM?
Как в таком случае оптимально решить задачу каскадного удаления?
 

Кром

Новичок
>картинки в базе хранить не хочется из соображений производительности.

А что с производительностью станет если их там хранить?

>Кроме того, товаров будет много, а размер БД ограничен хостером (все картинки не уместятся точно)

А размер файловой системы не ограничен? Тяжело вам.

>выходит, в данной ситуации уместнее пользовать MyISAM?

Не вижу посылки которая позволила сделать такой вывод.

>Как в таком случае оптимально решить задачу каскадного удаления?

Как обычно, с помощью php.
 

Panchous

Павел
А что с производительностью станет если их там хранить?
Вроде здесь же и обсуждалось, что не стоит лишний раз муську нагружать картинакми...
А размер файловой системы не ограничен? Тяжело вам.
ЛОЛ) Конечно, дисковое пространство общее. Вопрос отпадает.
Как обычно, с помощью php.
Имеются ввиду рекурсивная функция с запросами к MySQL?
(где можно почитать про оптимальную реализацию подобной?)

-----
И все же, хотелось бы узнать, как предпочитают делать опытные люди. MyISAM или InnoDB (для конкретной задачи)?
 

Кром

Новичок
>Вроде здесь же и обсуждалось, что не стоит лишний раз муську нагружать картинакми...

Я тебе не предлагаю нагружать. Я тебе предлаю хранить. Разницу улавливаешь?

>Конечно, дисковое пространство общее.

Общее для всех? Тяжелый случай.

>Имеются ввиду рекурсивная функция с запросами к MySQL?
>(где можно почитать про оптимальную реализацию подобной?)

Отними запросы от "рекусивной функции с запросами" и у тебя получится "просто рекурсивная функция". Ты не знаешь, как реализовается рекурсивная функция?

>MyISAM или InnoDB (для конкретной задачи)?

Эта задача не предполагает выявления какого-то конкретного типа таблиц.
 

Panchous

Павел
Общее для всех? Тяжелый случай.
А разве нет?
Дисковое пространство общее для моих файлов и базы.
Отними запросы от "рекусивной функции с запросами" и у тебя получится "просто рекурсивная функция". Ты не знаешь, как реализовается рекурсивная функция?
Знаю.
Т.е. сначала надо выбрать ВСЕ дерево?
потом вычислить id для удаления и след. запросом удалить такие записи?
 

Кром

Новичок
>А разве нет?

Я так понимаю, ты просто путаешь "всех пользователей" с твоими "файлами и базой".

>Дисковое пространство общее для моих файлов и базы.

И что? В файлах они уместятся а в базе нет?

Т.е. сначала надо выбрать ВСЕ дерево?
потом вычислить id для удаления и след. запросом удалить такие записи?

Примерно так. ВСЕ дерево выбирать не обязательно, выбирать нужно ветвь которую ты собираешься удалять.
 

Panchous

Павел
И что? В файлах они уместятся а в базе нет?
C этим уже давно ясно)
Примерно так. ВСЕ дерево выбирать не обязательно, выбирать нужно ветвь которую ты собираешься удалять.
Для этого хватит информации (id-parant)?
Чтобы выбрать только одну ветвь?
 

Кром

Новичок
>Для этого хватит информации (id-parant)?
>Чтобы выбрать только одну ветвь?

Ну конечно хватит. Нашел id, потом ищешь тех у кого такой parent_id и снова по циклу. На деталях есть статьи про деревья. Так же по форуму десятки топиков. Тема затерта весьма.
 

Panchous

Павел
Ну конечно хватит. Нашел id, потом ищешь тех у кого такой parent_id и снова по циклу.
Туплю... но не доходит.
Не пойму, каким-таким запросом выбрать только нужную ветвь при id-parent в базе (без доп. информации)?
А может проще ВСЕ дерево вытащить (категорий будет всумме неболее 100), а потом - PHP...

На деталях есть статьи про деревья. Так же по форуму десятки топиков. Тема затерта весьма.
Смотрю...
Как правило отправляют на NestedSets.
 

Kelkos

Сам себе программер
Реализация каталога товаров: MyISAM vs InnoDB
А в чём проблема то?

А вот насчёт удаления целых каталогов с товарами - НИКОГДА этого не делаю.. У клиентов есть дурная привычка к "массовым убийствам" товаров с последующим раскаянием и слёзым просьбам вернуть всё "взад".
Хотите удалить каталог? Отл.. перенесите его в "корзину" и если не передумали, то убивайте по 1-му товару пока не надоест в свободное время.
 

Кром

Новичок
Kelkos что бы там ни было, а когда нибудь товары удалить придется. И сделать это лучше быстро.
Что касается вопроса "когда" - тут ты прав. Не тогда когда клиент нажал кнопку "Удалить", а тогда, когда пройдет определенное время. Месяца обычно достаточно, но в теории, если место не ограничено, можно хранить достаточно долго.
 

crocodile2u

http://vbolshov.org.ru
Насчет прикрепленных к итемам каталога файлов:

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

DiTHER

bang bang
Автор оригинала: Кром
>(тогда теряется смысл внешних ключей)

Если тебе так хочется, чтобы за целостность данных отвечала только база, положи картинки в базу. При первом обращении к картинке копируй ее на диск, в какую нибудь директорию, которую можно чистить раз в неделю/месяц.
Кром,
ты гений. Решение "как раз".

А можешь мне примерно сказать сильно ли пострадает скорость при выборке (не картинок. просто данных). Если:

размер таблицы без картинок ~18 мб
размер картинок ~90мб

т.е. увеличение таблицы с 18 до 108 мб примерно. Может ощутимо сказаться на выборке?

И ещё может быть ты мне сразу подскажешь (никогда я не работал с blob-данными в mysql). Есть ли рекомендуемые ограничения на размер blob-поля. Или один blob, скажем, в 30 мб это ещё "цветочки", но злоупотреблять не стоит?
 

DiTHER

bang bang
это тоже самое что "не держи блобы в базе вообще". Меня как раз интересует целостность.
 

svetasmirnova

маленький монстрик
это тоже самое что "не держи блобы в базе вообще". Меня как раз интересует целостность
А почему, если блобы в отдельной таблице хранить, целостность нарушится?
 
Сверху