2009-07-18 3 views
0

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

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

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

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

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

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

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

+0

Когда вы извлекаете изображение? Нет необходимости извлекать его до тех пор, пока браузер не попросит об этом - так, чтобы выборка не была частью сборки этой страницы - только ссылка должна быть вставлена ​​в html – nos

+0

Под «изображением» я просто имел в виду мою конструкцию данных для изображений , Я фактически не извлекаю файл изображения, а только данные из базы данных, которые сообщают мне URL-адрес файла изображения плюс полезную информацию, например, текст alt. Извините, что было неясно. – Robert

ответ

2

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

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

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

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

+0

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

0

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

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

+0

Я сделал это в предыдущем аналогичном проекте, но этот метод не способен обрабатывать отношения «многие ко многим» между конкретными продуктами и изображениями. – Robert

+0

Чтобы быть ясным, я не храню файлы изображений в базе данных, а просто указываю на файлы в файловой системе. – Robert

1

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

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

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

+1 - таблица ProductImageLinks кажется ненужной –

+0

Это не соотношение 1: 1. Каждое изображение может быть связано с несколькими конкретными продуктами, и каждый конкретный продукт может быть связан с несколькими изображениями. Например, фотография может содержать в себе два объекта, или может быть несколько разных фотографий одного и того же продукта. – Robert

 Смежные вопросы

  • Нет связанных вопросов^_^