2011-02-18 106 views
2

我正在处理一个将多种对象保存到数据库的项目。这些包括:文章,民意调查,作家等等。其中一些在设计时是未知的,所以我想要做的是构建一个通用表模式,使我能够将任何类型的项目保存到此数据库中。对象和对象元模式设计

我的设计

表对象

objectID int 
title varchar 
body text 
type int #will represent the ID of the type of object am inserting 

有了这样的情况或需求可能需要额外的数据,我决定,这将去我所谓的“对象元数据”的方法如下:

表Object_MetaData

metaID int 
metaKey varchar 
metaIntKey int #representing an integer value of metaKey which is calculated using some algorithm to speed up queries 
metaValue varchar(1000) 

我正在做所有的工作在PHP和MySQL顺便说一句。

这样的设计对于数据库中的长运行时的表现一对夫妇的事情耽搁了我的脑海里:

1)节约整型,布尔型,小文,大文成metaValue effecient? 2)长期来看,元数据表将会快速增长。这是维护恶梦吗? MySQL将如何处理这个问题?在获取对象时,我将不得不循环每个对象以获取其元数据,或者使用延迟加载一次加载所有元数据,或者在通过__get魔术方法请求加载任何单个元键时加载所有元数据。因此,当提取50个对象的列表时,当使用我建议的任何方法时,至少会执行50个选择语句。有没有更好的方法来做到这一点?

欢迎对此设计发表任何想法或意见。

回答

2

我建议重新设计您的解决方案。这种模式被称为“实体 - 属性 - 价值”(EAV),通常被视为反模式。相反,请在列中定义元数据属性(如果需要,可以使用同一个表或其他列)。也使用适当的数据类型。

我建议给Bill Karwin's book SQL AntiPatterns一个阅读。它有一些很好的见解,会在这里专门给你一个手。你可以从this presentation得到它的一些感觉...

+0

谢谢,所以这基本上意味着我必须克隆表,并根据需要添加列到每个表右?这是否会导致每张桌子的设计都有重复?这也要求例如“物品”表在每次新的要求需要新的信息与物品一起存储时必须被修改。元对象设计似乎更灵活,这样在运行时不需要更改。你怎么看? – Maverick 2011-02-18 22:55:21