【问题标题】:(my)SQL database - storing different types of same value(mySQL 数据库 - 存储不同类型的相同值
【发布时间】:2012-02-11 06:15:02
【问题描述】:

我需要存储不同类型的相同值。该值可以表示 DATE、INT、BOOLEAN、DOUBLE 和任何其他类型。我想知道是否有可能不使用多个表 - 每个表都用于不同的类型(我想这会使存储值的使用变得非常复杂(主要是搜索、过滤))。在一行中存储多个以NULL值为主的列表时,是否会导致存储和性能大幅下降?

我正在考虑包含此类示例列的表格,其中只会填充一个值列:

id valueVarchar  valueDate  valueBoolean  valueInt  valueDouble

如果这种方法显然是错误的,请赐教。

我正在使用 MySQL (InnoDB)(数据库不是大问题,如果需要可以更改)和 JPA 创建 JSF 应用程序。

编辑:

就目前而言,我有一个带有一个文本值字段的表格。我正在服务器端将值转换为/从数据库转换。因为该项目刚刚开始,现在改变模型将比未来更痛苦,我正在考虑是否存在更好的方法。

【问题讨论】:

  • 为什么您需要将相同的值存储为多个不同类型 - 您希望通过这样做实现什么?为什么一个特定的值可能有多种不同的类型?
  • 有点混乱;如果您因为这个值的类型不同而尝试这样做,那么我建议使用 VarChar;因为存在将其转换为其他数据类型的转换函数。
  • @MarkBannister:突然想到:一个企业可能有应用程序/上下文使用不同的 pi 值,例如作为浮点数和固定小数。也可能是不同的舍入算法,例如在 3 d.p. 处截断,银行家四舍五入到 3 d.p.等
  • @MarkBannister:我正在创建注释系统,在其中我将一些具有许多属性的对象链接起来——这些属性可以是任何类型。属性有一个有意义的字段——值。我正在考虑不同的方法,但我不是数据库人员,所以我正在寻找建议;]
  • @MattDonnan 这就是我现在所拥有的,但我担心将来不会给我带来麻烦。

标签: mysql sql database jpa types


【解决方案1】:

如果您使用的是 EclipseLink,则可以使用 @TypeConverter 将任何数据类型转换为字符串。您还可以有两列,一列用于值,一列用于值的类型,您可以使用 @Transformation 映射来映射它。

使用通用 JPA,您可以使用属性访问通过 get/set 方法转换类型。

【讨论】:

  • 感谢您的建议。我会熟悉它。
  • 我觉得OP的原设计比这个好一点。在同一列中存储不同的数据类型对数据库的使用不是很好。
【解决方案2】:

从 cmets 看来,似乎打算为每个 实体,每个 属性 将其 单独存储。 p>

这个有一个名字:叫做Entity-Attribute-Value model,或者简称EAV。

尽管在某些情况下 EAV 是唯一适用的解决方案,但它的使用通常被视为一种反模式,其中有可行的替代方案。

可以在here 找到不适当实施 EAV 数据库的案例研究。

可以使用 EAV 的最明显目的之一是在关系数据库中持久保存来自 OO 设计的对象数据。如果您想这样使用它,我建议您考虑使用Object-Relational Mapping(简称ORM)。

您可以使用eav 标签找到关于 SO 的 EAV 相关问题。

【讨论】:

    【解决方案3】:

    您可以将任何内容存储为二进制值,并在客户端转换为类型。但是该值很难在查询条件中有效地使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      相关资源
      最近更新 更多