在数据库中创建Metatable表

时间:2008-12-12 21:21:59

标签: database-design entity-attribute-value

有没有人有任何关于在数据库中创建元表的建议?这些表将用于使用数据库模拟数据库中的表。这适用于您希望轻松地将结构(更多字段)动态添加到数据库中而无需担心所涉及的所有技术问题。我看到的唯一例子是:

表:MetaTables 字段:tableName,tableDescription

表:MetaFields 字段:tableName,fieldName,fieldDesc,fieldDesc

表:MetaCodes 字段:tableName,fieldName,codeName,codeValue等...

我之前从未真正使用过这样的东西,并且想知道是否有任何“陷阱”需要注意。

这样的事情是否可以合理维护,或者你会建议反对吗?

9 个答案:

答案 0 :(得分:9)

您所谈论的是一种灵活的架构模型,通常称为开放架构模型或实体属性值模型。谷歌那些,你将获得大量的参考和文章。

我还建议你不要回避添加列的设计。当设计中的波动水平不那么显着时,我经常看到人们采取这样的方法。编写新数据容器(表,列等)的脚本并不难。

答案 1 :(得分:5)

我认为采用完全实现的关系数据库,忽略几乎所有功能,并在关系数据库之上构建自己的关系数据库的想法是等待发生的麻烦。

构建自己的模型听起来很“酷”。

您当然必须构建自己的元级别空间管理。这是颈部的中度疼痛。

查询执行,优化,索引处理和什么不相对复杂。

然后,有事务,锁定,死锁检测等。这真的很难弄清楚。但是,一旦你开始工作,它将有一个巨大的“酷”因素。

此外,您还需要发明一个API。 ODBC工作水平较低,而且您希望在更高级别工作,因此您必须创建自己的“酷”版本的ODBC。

“酷”因素最能胜过所有这项工作。你将花费数年时间来实现这一目标。

答案 2 :(得分:3)

大多数情况下,元表模式首先会破坏使用关系数据库的目的。除了基本事务/ ACID属性之外,关系数据库在向系统添加两个大功能时非常有用:a)与报表生成器等应用程序共享数据,以及b)允许进行即席查询。

如果以上两者都不适用并且您仍然想要通用,那么其他一些数据持久性解决方案可能会更好。您可以非常优雅地在Berkley DB中推出自己的解决方案,或者尝试使用通用架构的变体:

http://theprogrammersparadox.blogspot.com/2008/06/structuring-noun-verb-data.html

保罗。

答案 3 :(得分:3)

正如keithwarren7所建议的,做一些谷歌,你会看到(根据你的评论)这样做完全不酷。 (好吧,在某些情况下,但几乎总是没有,IMO。)

酷,比你想象的要少得多,是按照预期的方式使用关系数据库,并采用经过深思熟虑的架构设计。您会发现这为您提供了更好的数据完整性,性能,使用更少的存储空间,并且通常比实体 - 属性 - 值模型更容易使用。您将阅读一些明显的陷阱,例如,您将负责自己实施参照完整性,而不是数据库。

无论如何,在你开始之前仔细研究这个想法(超越stackoverflow),因为一旦你以这种方式实现,改变你的想法真的很重要。

答案 4 :(得分:2)

我同意那些说E-A-V看起来冷却的评论,但并不酷。它正在做大量的工作,结果证明是次边际或彻底适得其反。

我使用自己的包含元数据的用户表的目的是比较两个不同的数据库,以找出它们分散的位置。比较两个相同结构的模式之间的值很简单。检测模式之间的差异更加微妙,并涉及比较元数据。

我的方法是将数据从两个或多个数据库的元数据表复制到我的“元数据库”中的用户定义的元数据表中,然后继续进行比较。在大约一个小时内,我发现一个列在一个数据库中被定义为真实而在另一个数据库中被定义为整数。几个月来,这一直隐藏在DBA之外。我还发现了一个或另一个数据库中缺少的几列。

今天,有一些工具可以为您进行这种比较。但是,如果您了解DBMS为您构建的系统表的架构,那么自己动手并不难。

答案 5 :(得分:1)

如果你的老板想要真的很酷,并且想要动态元数据,那就忘记笨重的旧关系数据库 - 尝试RDF和语义数据引擎! RDF允许您以相同方式存储和查询元数据和数据。数据库中的每个实体都是完全动态且自我描述的。有关示例实现,请参阅Sesame

RDF是EAV设计的逻辑扩展。

答案 6 :(得分:0)

您可以始终使用单个XML数据字段,而不是使用表和字段来表示动态结构。许多主流RDBMS允许在XML中索引属性/元素,因此您的查询甚至可能具有高性能。

答案 7 :(得分:0)

对不起,正如其他海报所指出的那样,重新发明轮子。

如果要使用此数据,大多数数据库都包含包含数据库架构的表。这可以用于反射的目的。

任何好的数据库手册都应该告诉你如何访问这些表。

答案 8 :(得分:0)

在一个大的eav-table中使用大型数据集进行一些性能测试。如果你的老板看到一个缓慢的表现,他/她将不会使用“酷”这个词。