我正在构建一个PHP/MySQL网站,我目前正在研究我的数据库设计。我确实有一些数据库和MySQL的经验,但我从来没有从头开始构建一个真正的应用程序的数据库,希望能获得一些很好的流量,所以我很乐意听到已经完成它的人的建议,以避免常见错误。我希望我的解释不是太混乱。实现通用对象的数据库结构
我需要
什么在我的应用程序,用户应该能够写个帖子(标题+文字),然后创建一个“对象”(可以是任何东西,如视频,或歌曲等)并将其附加到帖子中。该网站有用户可以创建的预定义对象类型的列表,我将来可以添加新的类型。用户还应该能够在专用页面中查看对象的详细信息并为其添加注释 - 这同样适用于帖子。
我试过
我创建了一个objects
表这些字段:oid
,type
,name
和date
。此表包含用户应该能够添加注释的任何内容(即帖子和对象)的记录。然后我创建了一个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
相比如何?
我希望这些问题确实有意义。这是我的第一个这样的项目,我只想避免在启动之前犯大错,并发现我需要完全重新设计设计。
我更新了第一篇关于NoSQL的问题,谢谢。 – pt2ph8 2010-09-29 08:40:16