我正在为一个系统设计一个数据库结构,在这个系统中,一个实体可以拥有一组用户定义的动态元属性。元字段(例如:流行度、转换等)而技能值(int、boolean或string)则由管理员动态输入。
在数据填充结束时,管理员将能够创建查询,根据元值筛选出实体。
通常,我会遵循wordpress的DB结构,即拥有以下结构的元表。
Meta => id, entitiy_id, meta_key, meta_data_type, meta_value但是,我担心数据的性能和查询能力,因为我希望它更加密集。更不用说,我将使用mysql作为DBMS。
如果有比这更好的做法,请提出建议。如果没有,在发展这个结构之前,我是否应该注意到什么缺陷。
发布于 2011-09-20 07:51:37
据我所知,你可以采取以下两种方法:
这是两个人之间的交换。您必须判断您的应用程序场景,并决定您最需要什么以及什么是绝对不允许的。然后决定您想要使用的其余标准。
我看到并使用了上面提到的两种方法,必须说第二种方法对我更好(尽管没有大量的查询),即使从SQL /数据库规范化的角度来看它是反模式。然而,我们不是为好的SQL数据库设计付费,而是为工作的应用程序付费。
发布于 2011-09-19 22:30:59
我会认真地反对这种设计。它是一个名为实体属性值模式的数据库反模式.
以下是一些关于原因的帖子:
http://karwin.blogspot.com/2009/05/eav-fail.html
http://www.jonathanlevin.co.uk/2008/04/sql-is-in-fact-programming-language.html
更好的方法是从您拥有的列/属性开始,并在稍后阶段添加它们。
您可以在以后运行ALTER TABLE语句来进行更改,而且还有一些工具可以以“联机”的方式进行更改。
http://openarkkit.googlecode.com/svn/trunk/openarkkit/doc/html/oak-online-alter-table.html
您可以做的其他事情是使用基于文档的数据库或XML。您还可以将XML文档存储在MySQL中的blob/文本文件中,但是这样会损失很多好处。
https://dba.stackexchange.com/questions/5955
复制相似问题