对象和对象元架构设计

时间:2011-02-18 22:21:40

标签: php mysql performance database-design

正在开发一个将许多类型的对象保存到数据库中的项目。这些包括:文章,民意调查,作家等等。其中一些在设计时我不了解,所以我要做的是构建一个通用的表模式,使我能够将任何类型的项目保存到这个数据库中。 / p>

我的设计

表格对象

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 btw完成所有工作。

从长远来看,在进行有关数据库性能的设计时,我想到了一些事情:

1)将int,boolean,small text,big text保存到metaValue中是否有效?

2)从长远来看,元数据表将会很快增长。这是维持噩梦吗? MySQL将如何处理这个问题?

3)在获取对象的PHP中,我将必须循环每个对象以获取其元数据,或者使用延迟加载一次加载所有元数据,或者通过__get魔术方法加载任何单个metakey。因此,当获取50个对象的列表时,使用我建议的任何方法时,将执行至少50个select语句。有没有更好的更有效的方法呢?

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

1 个答案:

答案 0 :(得分:2)

我建议重新设计您的解决方案。此模式称为“实体 - 属性 - 值”(EAV),通常被视为反模式。而是在列(同一个表中,或者根据需要另一个表)中定义元数据属性。使用正确的数据类型。

我建议给Bill Karwin's book SQL AntiPatterns读一读。它有一些很棒的见解,可以帮助您。您可以从this presentation ...

了解其中的部分内容