长列与长行数据库

时间:2013-06-17 01:38:44

标签: mysql sql database normalization entity-attribute-value

我在选择数据库表设计方式之间陷入困境。场景是我需要制作手机和平板电脑规格数据库。数据库可以有两种方式......

1-长列方式,我将每个规范字段添加为一个单独的列,这将导致38列,从而在一行中生成完整的产品规范。

2-长行方式,我只会广告5列:idnamevaluebrandmodel,保存名称值对中的每个产品规范,每个规范将产生38行。

我应该走哪条路......为什么......?

2 个答案:

答案 0 :(得分:3)

第一种解决方案更传统。第二个称为“实体 - 属性 - 值”(EAV)。

对于大多数应用,首先是优选的。例如,在第二种方法中,所有值必须是相同的类型。但可能是产品发布的日期,其他产品可能是字符串。

第二个也导致更清晰的查询。必须将来自几十行的属性汇集在一起​​以描述单个模型可能是低效的。至少,它会导致更麻烦的查询。

这样的数据结构也使得进行数据验证检查以及与其他表具有外键关系变得更加困难。

最后,EAV方法使用更多空间。

在某些情况下,EAV非常有价值。例如,如果您有数千个属性,并且只有少数属性用于任何给定的产品。但是,对于单个表格,38列是非常合理的。

答案 1 :(得分:0)

问题应该是您是否会预见到将来需要添加的任何列,或者是否会使用多列。

对于您的第二种选择,您可以更进一步:

phones: [id], brand, model
attributevalues: [(phone), (name)], value
attributenames: [name]

其中[xx]是主键,(xx)是外键。

但是,要利用打字,首先是首选方法。

您还可以对其进行非规范化,并在另一个表中引入相关属性块,并使用1:1关系将其链接起来;您可以使用它将较少使用的属性移动到另一个表中。请注意,这只是一个空间折衷。