Как хранить данные об изображении товара и товара для интернет-магазина? - PullRequest
0 голосов
/ 19 июля 2009

Я работаю над приложением магазина на PHP с MySQL. В настоящее время я храню свои данные в 4 таблицах: одна для продуктовых линеек, одна для конкретных продуктов в этих продуктовых линейках, одна для изображений продуктов и одна, которая указывает, какие изображения связаны с какими конкретными продуктами. Каждый конкретный продукт принадлежит одной линейке продуктов, каждое изображение продукта может принадлежать нескольким конкретным продуктам, и каждый конкретный продукт может иметь несколько изображений. Мои таблицы выглядят так:

ProductLines
    id, name, description, etc.
SpecificProducts
    productLineID
    id, color, size, etc.
ProductImageLinks
    specificProductID
    imageID
Images
    id, imageFileLocation, name, etc.

Таким образом, он работает нормально, но, похоже, он не очень эффективен для поиска.

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

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

Итак, мой вопрос: есть ли лучший способ сохранить эти данные? Или лучший способ получить его на основе базы данных, которая у меня уже есть? Или один из двух вариантов, которые я определил, действительно является моей лучшей ставкой?

Редактировать: Я не храню файлы изображений в базе данных. Файлы изображений хранятся в файловой системе. Моя таблица «Изображения» в базе данных просто хранит местоположение файла изображения вместе с полезной информацией, такой как заголовок изображения, альтернативный текст и т. Д.

Ответы [ 3 ]

2 голосов
/ 19 июля 2009

Да - просто напишите один запрос, который будет извлекать всю эту информацию за один выстрел.

Я немного обеспокоен этим, но вы можете посмотреть запросы в справочнике mysql.

  1. создать запрос, объединяющий эти таблицы по соответствующим ключам
  2. вам нужно выбрать первый элемент в подзапросе, который извлекает изображения для определенного запроса, а затем упорядочить по rand () и выбрать первый.

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

1 голос
/ 19 июля 2009

Что касается дизайна базы данных, у вас довольно солидный (и стандартный) дизайн. Вы можете объединить таблицы ProductImageLinks и Images, если для сохранения некоторых запросов это соотношение 1: 1.

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

  1. Создайте новую таблицу в вашей базе данных с именем ProductLineImages. Вместо случайного выбора изображения из связанных продуктов, загрузите туда набор изображений, который вы можете выбрать случайным образом. Это не будет так динамично, но это самый эффективный метод.
  2. Вы можете сделать все, что вы описали, одним (но менее эффективным, чем # 1) запросом.
0 голосов
/ 19 июля 2009

Вы настроены на сохранение изображений в базе данных mysql?

В моем аналогичном приложении я просто сохранил изображения в /images/productimages/imagesize/productid.jpg, где imagesize - «маленький», «большой» и т. Д., Для разных размеров миниатюр, а productid.jpg - это идентификатор из Таблица SpecificProducts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...