Эффективный способ хранить заказ в MySQL для списка предметов - PullRequest
3 голосов
/ 10 июня 2010

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

У меня есть база данных mySQL, которая содержит данные о наборе имен фотографий. О, скажем, 100 имен фотографий

Таблица 1: (фотографии) имеет следующие поля: photo_id, photo_name

Исходные данные:

1 | sunshine.jpg
2 | cloudy.jpg
3 | rainy.jpg
4 | hazy.jpg
...

Таблица 2: (категории) имеет следующие поля: ID_категории, имя_категории, заказ по категориям

Исходные данные:

1 | Summer Shots | 1,2,4
2 | Winter Shots | 2,3
3 | All Seasons  | 1,2,3,4
...

Эффективно ли хранить таким образом порядок фотографий для каждой записи через значения, разделенные запятыми? Это один из подходов, который я видел раньше, но я хотел знать, быстрее ли что-то еще во время выполнения.

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

Пример: Летние снимки -> sunshine.jpg, cloudy.jpg, hazy.jpg, поскольку он сопоставлен с 1,2,4

Итерация по всем категориям, а затем фотографии будут иметь O (n ^ 2), и должен быть лучший / более быстрый способ. Пожалуйста, просветите меня:)

1 Ответ

6 голосов
/ 10 июня 2010

мне кажется, вы могли бы использовать другую таблицу для связи между фотографиями и категориями с полями category_id, order_id и photo_id

Я думаю, что было бы проще использовать, и вы сможете присоединиться

Я бы также предложил вам установить photo_id в качестве индекса в этой новой таблице, если вы решите использовать это решение.

- РЕДАКТИРОВАТЬ -

таблица фото 'photo_id', 'photo_name'

  • photo_id - это первичный ключ, уникальный, с автоматическим приращением и, возможно, индексом

таблица категорий 'category_id', 'category_name'

  • category_id - это первичный ключ, уникальный (если только вы не хотите иметь возможность иметь разные имена для одной и той же категории) с автоматическим приращением и, возможно, индексом

таблица category_content 'category_id', 'photo_id', 'order'

  • category_id - это внешний ключ, указывающий на столбец категории таблицы category_id
  • photo_id - это внешний ключ, указывающий на столбец фотографии таблицы photo_id
  • первичный ключ - это комбинированный первичный ключ между category_id и порядком
  • photo_id и category_id являются индексами

Использование 'index' каким-то образом говорит MySQL о том, что вы хотите оптимизировать исследование индексированных столбцов, когда вы замечаете, что во многих запросах есть WHERE и / или JOIN для определенных столбцов, обычно рекомендуется установить столбец для индексации. , Кроме того, если это не упрощает что-либо, почти никогда не бывает хорошей идеей объединить несколько данных в одну, как вы, исключение может составлять комбинация префикса номера телефона с реальным номером и несколько подобных вещей, но это исключительные случаи. То, как вы жестко закодировали порядок в таблице, было бы хорошо, если бы вы использовали файлы, но в базе данных лучше использовать другую таблицу, чем разделители запятых. Есть вопросы?

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