首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体动态元字段的数据库设计

实体动态元字段的数据库设计
EN

Database Administration用户
提问于 2011-09-19 15:55:38
回答 2查看 4.1K关注 0票数 4

我正在为一个系统设计一个数据库结构,在这个系统中,一个实体可以拥有一组用户定义的动态元属性。元字段(例如:流行度、转换等)而技能值(int、boolean或string)则由管理员动态输入。

在数据填充结束时,管理员将能够创建查询,根据元值筛选出实体。

通常,我会遵循wordpress的DB结构,即拥有以下结构的元表。

代码语言:javascript
复制
Meta => id, entitiy_id, meta_key, meta_data_type, meta_value

但是,我担心数据的性能和查询能力,因为我希望它更加密集。更不用说,我将使用mysql作为DBMS。

如果有比这更好的做法,请提出建议。如果没有,在发展这个结构之前,我是否应该注意到什么缺陷。

EN

回答 2

Database Administration用户

发布于 2011-09-20 07:51:37

据我所知,你可以采取以下两种方法:

  1. 如果您想要性能、更简单的查询、更简单的编程,那么应该使用ID作为外键创建第二个表,并为要存储的每个属性创建一个列。对于任何新属性,您都必须更改数据库模式,这可能是一个主要的缺点。
  2. 如果您需要您的数据库模式中的灵活性(因为您的元属性是事先不知道的或者是要更改的),那么上面的内容将不起作用,但是它会增加代码和查询的复杂性(取决于您的框架/应用程序),并且与第一种选择相比也会导致性能低下。较差的性能可以用更多的硬件在一定程度上得到补偿,但这是昂贵的。

这是两个人之间的交换。您必须判断您的应用程序场景,并决定您最需要什么以及什么是绝对不允许的。然后决定您想要使用的其余标准。

我看到并使用了上面提到的两种方法,必须说第二种方法对我更好(尽管没有大量的查询),即使从SQL /数据库规范化的角度来看它是反模式。然而,我们不是为好的SQL数据库设计付费,而是为工作的应用程序付费。

票数 4
EN

Database Administration用户

发布于 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/文本文件中,但是这样会损失很多好处。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/5955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档