我正在构建一个laravel网络应用程序,希望用户在其中创建相册并将内容放入相册。他们可以放在专辑中的东西主要是图像,也可以是文本、youtube视频、声云曲目等(即将推出)。每一条内容都将是相册中的一个项目。
我的"解决方案":我有一张相册表和一张内容表。内容表行是我要存储的所有内容。我想创建一个content_meta表,该表具有内容表的外键(该表又具有相册表的外键)。内容表具有关于要存储的内容类型(图像、视频、文本、youtube视频)的信息,而contentmeta表具有每条内容的所有信息。
例如,图像在内容表中有一行:
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视频?)?
在我的应用程序中,每个相册项目只能发布一种内容类型。不像在脸书上,你会发布一张带有文字的图片!
你给我如何解决这个难题的建议真的会帮助我的!
这是多态性的完美使用。您可以创建一个表来存储不同类型的介质。变形表将存储模型介质类型等
阅读此处的文档:http://laravel.com/docs/5.1/eloquent-relationships#polymorphic-关系
为了让你进入最佳状态,Jeffery Way有一个很好的视频:https://laracasts.com/lessons/polymorphic-huh
Adam Wathan最近做了一个很好的演员阵容:http://adamwathan.me/2015/09/03/pushing-polymorphism-to-the-database/