Я создаю веб-приложение laravel, в котором я хочу, чтобы пользователи создавали альбомы и помещали в них материал. То, что они могут поместить в альбом, это в основном изображения, но также тексты, видео с YouTube, звуковые дорожки и многое другое (впереди). Каждый фрагмент контента будет элементом в альбоме.
Мое «решение»:
У меня есть таблица альбомов и таблица содержимого. Строки таблицы содержимого — это все части содержимого, которые я хочу сохранить. Я думал о создании таблицы content_meta с внешним ключом к таблице содержимого (который, в свою очередь, имеет внешний ключ к таблице альбомов). таблица содержимого содержит информацию о типе сохраняемого содержимого (изображение, видео, текст, видео на YouTube), а таблица content_meta содержит всю информацию для каждого фрагмента содержимого.
Например, изображение имеет строку в таблице содержимого:
id | album_id | user_id | content_type
------------------------------
1231 | 311 | 973 | image
и это изображение имеет следующие строки таблицы content_meta
id | content_id | meta_option | meta_value
-------------------------------------------
1231 | 1231 | thumb_url | http://example.com/img/1231/thumb.jpg
1231 | 1231 | full_url | http://example.com/img/1231/thumb.jpg
1231 | 1231 | description | what an image this is!
Мой вопрос Как правильно хранить эти фрагменты контента в базе данных?. Решение, которое я придумал, является ли оно масштабируемым (для многих альбомов и для многих пользователей)? Будет ли легко добавить больше типов контента в будущем?
Я ни в коем случае не эксперт по архитектуре / дизайну веб-приложений, так как я «самоучка». Я действительно хочу научиться делать вещи правильно!
Во многих реальных примерах я сталкивался с другим решением, в котором я видел изображения, хранящиеся в таблице мультимедиа. Но тогда, как я могу хранить видео YouTube, например? Буду ли я создавать разные таблицы для всех типов контента, которые я хочу хранить (таблицы для изображений, видео, видео на Youtube, песни Soundcloud и т. Д.)?
Или мне следует создать таблицу мультимедиа (для изображений и видео) и таблицу контента (для сохранения текстов и фрагментов HTML, например видео YouTube?)?
В моем приложении вы можете опубликовать только один тип контента на элемент альбома. Не так, как на Facebook, где вы бы опубликовали изображение с текстом!
Вы бы действительно помогли мне, дав мне совет о том, как справиться с этой дилеммой!
Это идеальное использование полиморфизма. Вы можете хранить таблицы для хранения различных типов носителей. В таблице морфинга будут храниться модели типов носителей и т. Д.
Прочитайте документы здесь: http://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations
Также, чтобы помочь вам в этом, у Джеффри Уэй есть хорошее видео: https://laracasts.com/lessons/polymorphic-huh
И Адам Уотан недавно сделал хороший актерский состав: http://adamwathan.me/2015/09/03/pushing-polymorphism-to-the-database/
Других решений пока нет …