【发布时间】:2010-09-27 10:16:13
【问题描述】:
我正在构建一个 PHP/MySQL 网站,目前正在从事我的数据库设计。我确实有一些数据库和 MySQL 经验,但我从来没有从头开始为现实世界的应用程序构建数据库,希望能获得一些良好的流量,所以我很想听听已经做过的人的建议,以避免常见的错误。我希望我的解释不会太混乱。
我需要什么
在我的应用程序中,用户应该能够写一篇文章(标题 + 文本),然后创建一个“对象”(可以是任何东西,如视频或歌曲等)并将其附加到邮政。该站点有一个用户可以创建的预定义对象类型列表,将来我应该能够添加新类型。用户还应该能够在专用页面中查看对象的详细信息并向其添加评论 - 这同样适用于帖子。
我尝试了什么
我创建了一个 objects 表,其中包含以下字段:oid、type、name 和 date。此表包含用户应该能够添加 cmets 的任何记录(即帖子和对象)。然后我创建了一个 postmeta 表,其中包含其他帖子数据(例如文本、作者、上次编辑日期等),一个 videometa 表用于有关“视频”对象(URL、描述等)的数据,等等。 postobject 表 (pid,oid) 将对象链接到帖子。此外,还有一个 comments 表,其中包含评论文本、作者和它所引用的对象的 ID。
由于对象类型列表是预定义的并且可能不会更改(尽管我仍然需要能够随时轻松添加类型而无需更改应用程序的代码结构或数据库设计),而且它相对较小,为每种类型创建一个“元”表并在我的应用程序中制作一个对应的PHP类来处理它是没有问题的。
最后,网站上的页面需要显示所有帖子的列表,包括附加到它的对象,按日期排序。因此,我从objects 表中获取类型为“post”的所有记录,并将其与postmeta 连接以获取帖子元数据。然后我查询postobject 获取所有附加到此帖子的对象,查询comments 获取所有cmets。
问题
这有意义吗?以这种方式为现实世界的网站设计数据库有什么好处吗?我需要加入很多表来获取我需要的所有数据,objects 表会变得很大,因为它包含几乎所有项目(不过只有类型、名称和创建日期)——这是为了保持数据库和应用程序代码灵活,但它在现实世界中是否有效,或者从长远来看是否太昂贵?我是否用这种 OOP 方法以错误的方式思考它?
更具体地说:假设我需要列出所有帖子,包括它们的附加对象和元数据。我至少需要加入这些表:posts、postmeta、postobject 和{$objecttype}meta(更不用说users 表来获取特定用户的所有帖子,例如)。即使我只使用数字索引,我这样做会不会表现不佳?
另外,我考虑过在这个项目中使用 NoSQL 数据库 (MongoDB)(感谢 Stuart Ellis 的建议)。显然它似乎更合适,因为我在这里需要一些灵活性。但我的疑问是:我的对象的元数据包括对数据库中其他记录的大量引用。那么如果我不能使用JOIN,我该如何避免数据重复呢?我应该使用 DBRef 和here 描述的技术吗?就性能而言,它们与上述结构中使用的 MySQL JOINs 相比如何?
我希望这些问题确实有意义。这是我的第一个此类项目,我只是想避免在启动它之前犯下巨大的错误,并发现我需要完全重新设计设计。
【问题讨论】:
标签: mysql database-design nosql