繁体   English   中英

为通用对象实现数据库结构

[英]Implementing a database structure for generic objects

我正在建立一个PHP / MySQL网站,目前正在从事数据库设计工作。 我确实有一些数据库和MySQL的经验,但是我从来没有为一个现实的应用程序从头开始构建一个数据库,希望它会带来一些良好的访问量,所以我很想听听已经这样做的人的建议,以避免常见错误。 我希望我的解释不要太混乱。

我需要的

在我的应用程序中,用户应该能够编写帖子(标题+文字),然后创建一个“对象”(可以是任何东西,例如视频或歌曲等)并将其附加到帖子上。 该站点提供了用户可以创建的预定义对象类型的列表,将来我应该可以添加新的类型。 用户还应该能够在专用页面中查看对象的详细信息并为其添加注释-帖子也是如此。

我尝试了什么

我用以下字段创建了一个objects表: oidtypenamedate 该表包含用户应能够向其添加注释的任何内容(即帖子和对象)的记录。 然后,我创建了一个postmeta表,其中包含其他发布数据(例如文本,作者,最后编辑日期等),一个videometa表,用于存储有关“视频”对象(URL,描述等)的数据,等等。 postobject表( pidoid )将对象链接到帖子。 此外,还有一个comments表,其中包含注释文本,作者及其引用的对象的ID。

由于对象类型的列表是预定义的,并且可能不会更改(尽管我仍然需要随时可以在不更改应用程序代码结构或数据库设计的情况下轻松添加类型的能力),并且它相对较小,因此不是为每种类型创建“元”表并在我的应用程序中创建相应的PHP类来处理该表的问题。

最后,该站点上的页面需要显示所有帖子的列表,包括按其日期排序的所有附件,包括附加到该对象的对象。 因此,我从objects表中获取所有类型为“ post”的记录,并将其与postmeta合并以获取发布元数据。 然后我查询postobject让所有连接到这个职位的目的,并comments让所有的评论。

问题

这有意义吗? 以这种方式为现实世界的网站设计数据库有什么好处? 我需要联接很多表来获取所需的所有数据,而objects表将变得非常庞大,因为它几乎包含了每一项(虽然只包括类型,名称和创建日期)-这是为了保留数据库和应用程序代码灵活,但是它可以在现实世界中运行,还是从长远来看太昂贵了? 我是否用这种OOP方法以错误的方式思考它?

更具体地说:假设我需要列出所有帖子,包括其附加的对象和元数据。 我至少需要加入这些表: postspostmetapostobject{$objecttype}meta (例如,不用说一个users表来获取特定用户的所有帖子)。 即使仅使用数字索引,这样做也会导致性能下降吗?

另外,我考虑为该项目使用NoSQL数据库(MongoDB)(感谢Stuart Ellis的建议)。 显然,这似乎更合适,因为我在这里需要一些灵活性。 但是我的疑问是:我对象的元数据包含许多对数据库中其他记录的引用。 那么,如果我不能使用JOIN该如何避免数据重复? 我应该使用DBRef和此处描述的技术吗? 在性能方面,它们与上述结构中使用的MySQL JOIN相比如何?

我希望这些问题确实有意义。 这是我的第一个此类项目,我只是想避免在启动它之前犯下大错,并发现我需要完全重新设计。

我不是NoSQL专家,但我想知道这种特殊情况是否真的可以通过文档数据库(MongoDB或CouchDB)得到最好的处理。 各种类型的带有元数据附加的对象听起来像MongoDB设计用于的场景。

FWIW,您的表和字段命名存在一些问题,以后可能会困扰您。 例如,类型和日期是相当通用的,也是保留字。 您还混合了单数和复数表名,这将引发任何自动对象映射。

无论使用哪种数据库,最好找到一组现有的数据库命名约定并从一开始就应用它-这将帮助您避免细微的问题并确保命名保持一致。 我倾向于使用Rails命名约定ATM,因为它们众所周知且相当明智。

或者,如果您担心数据库空间,则可以将对象内容存储为文件,位于数据库外部。

如果您存储任何东西在数据库中,你已经在对象类型objects ; 因此,您可以只添加带有长二进制字段的object_contents表来存储对象。 您无需为每种新类型创建一个新表。

我已经在现实世界的Web应用程序中看到了很多JOIN(5到10)。 对象表可能会变大,但这只是索引。 到目前为止,您的数据库中没有发现任何错误。 顺便说一句,什么让我感到奇怪-一个帖子,一个对象以及每个单独的注释? 无法将图片与文字混合?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM