Я пытаюсь найти наиболее эффективную схему базы данных для конкретной структуры данных.Существует два основных объекта: Курсы и Темы . Курс - это коллекция Тем .A Тема имеет такие поля, как Видео , Ресурсы и Общее время видео .
Визуально представляет эту структуру данных:
- Course
|_ ID: 12345
|_ Themes: [A, B] (an array of UIDs)
- Theme A
|_ Courses: [12345,67890] (an array of UIDs)
|_ Videos: [1,2,3,4,5,7] (an array of UIDs)
|_ Resources: [10,11,12] (an array of UIDs)
|_ Video Total Time: 10000 (probably stored as seconds as tinyint field)
- Theme B
|_ Courses: [12345,98765] (an array of UIDs)
|_ Videos: [5,6,7,8] (an array of UIDs)
|_ Resources: [12,13,14] (an array of UIDs)
|_ Video Total Time: 20000 (probably stored as seconds as tinyint field)
Я пытаюсь добиться схемы базы данных для двух таблиц, одной для курсов и одной для тем .Идея состоит в том, чтобы иметь запрос MySQL, который получает Course и группировать все поля из Themes .Другими словами, когда я получу результат запроса MySQL (используя PHP), я получу массив или объект, подобный этому:
Array(
'ID' => 12345
'themes' => [A,B]
'videos' => [1,2,3,4,5,6,7,8]
'resources' => [10,11,12,13,14]
'video_total_time' => 30000
)
Итак, дело в том, что это две реляционные базы данных.Когда я отправляю запрос в БД с запросом данных из видео, мне нужно извлечь данные из всех тем и объединить их вместе.
Поскольку я не эксперт по SQL / MySQL, япытаясь немного узнать об этом, пока я пытаюсь понять:
1) Какова лучшая схема базы данных для этих двух объектов?Курсы и Темы?Особенно задумываясь о производительности
2) Могу ли я получить окончательные данные, используя SQL?Или я должен извлечь некоторые данные из базы данных, а затем проанализировать данные с помощью PHP?Что обычно быстрее?
3) Как лучше всего хранить массив UID?Как строка?Или есть лучший способ сохранить его?
Основная цель - производительность.У меня есть данные такого типа в другой схеме базы данных, объединенные с тысячами других типов данных (базы данных WP, таблицы wp_posts / wp_postmeta), но сейчас получить информацию, которая мне нужна, очень медленно.
Любаясоветы и предложения приветствуются!
Редактировать: Решено!
Было непросто решить, какой ответ лучше всего соответствует моим потребностям, потому что ответы @ TimMorton и @ PaulSpiegel ведут насна тот же путь, но с немного другими подходами.Ответ Тима великолепен, чтобы понять, как правильно проектировать схемы базы данных, принимая во внимание отношения «многие ко многим» и как организовывать свои запросы.Но поскольку основное внимание в этом вопросе уделяется повышению производительности, ответ Пола более сфокусирован на этом с конкретными сведениями о первичных ключах и индексах (которые имеют основополагающее значение для повышения производительности запросов).
В любом случае, я узналмного о разработке схемы базы данных.Вот уроки, которые я выучил:
- Не пытайтесь сложить все в одну и ту же таблицу: крайне важно правильно определить сущности, прежде чем определять, какие таблицы вам нужны.Я начал с двух таблиц, для видео и темы.Но оказывается, что подходящая схема БД для моей спецификации включает в себя таблицы для видео и ресурсов.
- Не храните массивы в столбцах: используйте правильную стратегию для определения отношений между сущностями.Если у вас есть отношения «один к одному» или «один ко многим», используйте идентификаторы сущностей и внешние ключи.Если у вас есть отношения «многие ко многим», то правильный шаблон проектирования - это создание выделенной таблицы только для создания отношений между сущностями.Это позволит вам использовать предложения JOIN в ваших запросах для объединения всех данных.
- Когда вы думаете о производительности, подумайте об INDEX: в зависимости от структуры таблицы, используя любой индексили составной индекс может улучшить производительность запросов.
- Не пытайтесь получить все в одном большом запросе: вы определенно можете, но с отдельными запросами для частей данных, которые вам нужны (включеномой пример: один запрос для получения всех тем для курса, один для получения всех видео для курса, один для получения ресурсов для курса) окупается организацией кода и удобочитаемостью.
Я не знаю, правильно ли я со всем выше, но это то, что я узнал до сих пор. Надеюсь, это поможет кому-то еще.