将int值作为varchar存储在mysql中是否会严重影响性能?

时间:2014-08-20 11:04:19

标签: mysql performance database-design

我正在开发一个应该多语言的网站,而且在某些产品中,许多领域的产品可能比其他产品更多(例如,未来产品可能会有额外的功能,旧产品没有它)。因为这个问题我决定有一个产品表,其中包含所有产品可以拥有的所有语言的相同产品(如宽度和高度),并添加另外三个表来存储额外的字段,如下所示:

field (id,name)
field_name(field_id,lang_id,name)
field_value(product_id, field_id, lang_id, value)

通过这样做,我可以从一个表中获取所有值,但问题是值可以是不同的类型,例如它可以是数字或文本。我检查了一个开源项目“Drupal”,并且他们为每个字段类型创建了一个表,通过连接,他们将检索节点数据。我想知道哪种方式会影响性能?为每个额外字段设置一个表或将所有值存储在一个表中并通过转换动态转换它们的类型?

提前谢谢

1 个答案:

答案 0 :(得分:4)

是的,但没有。您将以实体 - 属性 - 值格式(EAV)存储数据。总的来说这是非常低效的。以下是一些问题:

  • 正如您所写,您不能进行类型检查。
  • 您无法在数据库中设置外键关系。
  • 获取单行结果需要多个joingroup by
  • 您无法在特定列上编写索引以加快访问速度。

一些解决方法。您可以通过为不同类型设置单独的列来解决键入问题。因此,数据结构将具有:

  • 名称
  • 类型
  • 的valueString
  • ValueInt
  • ValueDecimal

或者您想支持的任何类型。

如果你想走这条路,还有其他一些“伎俩”。最重要的是对数字进行十进制对齐。因此,您可以存储'1''10',而不是存储' 1''10'。这使得该值更适合订购。

当遇到这样的问题时,我经常提倡混合方法。这种方法有一个固定的记录,重要的属性都很好地位于具有适当类型和索引的列中 - 列如:

  • ProductReleaseDate
  • 产品描述
  • 产品代码

无论什么价值观都是最有用的。然后可以将EAV表用于可选的其他属性。这通常会平衡关系数据库处理结构化数据的能力以及支持变量列的EAV方法的灵活性。