2010-09-27 50 views
3

我正在构建一个PHP/MySQL网站,我目前正在研究我的数据库设计。我确实有一些数据库和MySQL的经验,但我从来没有从头开始构建一个真正的应用程序的数据库,希望能获得一些很好的流量,所以我很乐意听到已经完成它的人的建议,以避免常见错误。我希望我的解释不是太混乱。实现通用对象的数据库结构

我需要

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

我试过

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

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

最后,网站上的一个页面需要显示所有帖子的列表,包括附加到它的对象,按日期排序。因此,我从objects表中获取“post”类型的所有记录,并使用postmeta加入以获取后期元数据。然后,我查询postobject以获得附加到该帖子的所有对象,并且获得所有评论。

的问题

这是否任何意义?以这种方式为真实世界的网站设计数据库有什么好处?我需要加入相当多的表来获取我需要的所有数据,而且由于它几乎包含每个项目(只有类型,名称和创建日期),因此表将变得很庞大 - 这是为了保留数据库而且应用程序代码是灵活的,但它在现实世界中还是行得通,还是从长远来看代价太高?我是用这种OOP方法以错误的方式思考它的吗?

更具体地说:假设我需要列出所有帖子,包括它们附加的对象和元数据。我需要加入这些表格,至少:posts,postmeta,postobject{$objecttype}meta(更不用说users表格可以获取特定用户的所有帖子)。即使我仅使用数字索引,我是否会得到糟糕的性能?

而且,我认为使用的NoSQL数据库(MongoDB的)这个项目(感谢司徒埃利斯的建议)。显然它似乎更合适,因为我需要一些灵活性。但是我的疑问是:我的对象的元数据包含很多对数据库中其他记录的引用。那么,如果我不能使用JOIN,我将如何避免数据重复?我应该使用DBRef和here描述的技术吗?它们在性能方面与上述结构中使用的MySQL JOIN相比如何?

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

回答

2

我不是一个NoSQL的人,但我不知道是否这个特殊的情况下,实际上可能最好的文档数据库(MongoDB的或CouchDB的)处理。带有元数据的各种类型的对象听起来就像MongoDB的设计场景。

FWIW,你有一对夫妇的问题与你的表,后来可能会咬你的字段命名。例如,类型和日期是相当通用的,也是保留字。您还混合了单数和复数表名,这会引发任何自动对象映射。

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

+0

我更新了第一篇关于NoSQL的问题,谢谢。 – pt2ph8 2010-09-29 08:40:16

0

或者如果您关心数据库空间,则可以将对象内容作为文件存储在数据库之外。

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

+0

我应该说明我并不需要存储实际的视频或歌曲文件,而是元数据只包含字符串和整数,这就是为什么带有这些额外数据的表格听起来更加自然。 – pt2ph8 2010-09-27 18:40:34

0

我在真实世界的Web应用程序中看到了很多JOIN(5到10)。对象表可能会变大,但这是索引。到目前为止,我没有看到数据库中有任何错误。顺便说一句,我觉得很奇怪 - 一篇文章,一篇文章,还有每篇文章的评论都不一样?无法将图片与文字混合?