【问题标题】:Implementing a database structure for generic objects为通用对象实现数据库结构
【发布时间】:2010-09-27 10:16:13
【问题描述】:

我正在构建一个 PHP/MySQL 网站,目前正在从事我的数据库设计。我确实有一些数据库和 MySQL 经验,但我从来没有从头开始为现实世界的应用程序构建数据库,希望能获得一些良好的流量,所以我很想听听已经做过的人的建议,以避免常见的错误。我希望我的解释不会太混乱。

我需要什么

在我的应用程序中,用户应该能够写一篇文章(标题 + 文本),然后创建一个“对象”(可以是任何东西,如视频或歌曲等)并将其附加到邮政。该站点有一个用户可以创建的预定义对象类型列表,将来我应该能够添加新类型。用户还应该能够在专用页面中查看对象的详细信息并向其添加评论 - 这同样适用于帖子。

我尝试了什么

我创建了一个 objects 表,其中包含以下字段:oidtypenamedate。此表包含用户应该能够添加 cmets 的任何记录(即帖子和对象)。然后我创建了一个 postmeta 表,其中包含其他帖子数据(例如文本、作者、上次编辑日期等),一个 videometa 表用于有关“视频”对象(URL、描述等)的数据,等等。 postobject 表 (pid,oid) 将对象链接到帖子。此外,还有一个 comments 表,其中包含评论文本、作者和它所引用的对象的 ID。

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

最后,网站上的页面需要显示所有帖子的列表,包括附加到它的对象,按日期排序。因此,我从objects 表中获取类型为“post”的所有记录,并将其与postmeta 连接以获取帖子元数据。然后我查询postobject 获取所有附加到此帖子的对象,查询comments 获取所有cmets。

问题

这有意义吗?以这种方式为现实世界的网站设计数据库有什么好处吗?我需要加入很多表来获取我需要的所有数据,objects 表会变得很大,因为它包含几乎所有项目(不过只有类型、名称和创建日期)——这是为了保持数据库和应用程序代码灵活,但它在现实世界中是否有效,或者从长远来看是否太昂贵?我是否用这种 OOP 方法以错误的方式思考它?

更具体地说:假设我需要列出所有帖子,包括它们的附加对象和元数据。我至少需要加入这些表:postspostmetapostobject{$objecttype}meta(更不用说users 表来获取特定用户的所有帖子,例如)。即使我只使用数字索引,我这样做会不会表现不佳?

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

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

【问题讨论】:

    标签: mysql database-design nosql


    【解决方案1】:

    我不是 NoSQL 人,但我想知道这种特殊情况实际上是否可以最好地使用文档数据库(MongoDB 或 CouchDB)来处理。附加元数据的各种类型的对象听起来像是 MongoDB 设计的那种场景。

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

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

    【讨论】:

      【解决方案2】:

      如果您担心数据库空间,也可以将对象内容存储为数据库之外的文件。

      如果您在数据库中存储任何内容,则您已经拥有objects 中的对象类型;所以你可以添加带有长二进制字段的object_contents 表来存储对象。您不需要为每个新类型创建一个新表。

      【讨论】:

      • 我应该澄清一下,我真的不必存储实际的视频或歌曲文件,而是元数据只包含字符串和整数 - 这就是为什么带有这些额外数据的表格听起来更自然对我来说。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-14
        • 2018-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多