2012-01-16 116 views
3

我需要存储不同类型的相同值。该值可以表示DATE,INT,BOOLEAN,DOUBLE和任何其他类型。我想知道是否有可能不使用多个表 - 每个表的不同类型(我想这会显着复杂的存储值的使用(主要是搜索,过滤))。在连续存储主要为NULL值的多个列表时,这会是一个巨大的存储和性能下降问题吗?(my)SQL数据库 - 存储不同类型的相同值

我有这样的例子列其中只有一个值列将充满思考表:

id valueVarchar valueDate valueBoolean valueInt valueDouble 

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

我使用MySQL(InnoDB)创建JSF应用程序(数据库不是一个大问题,它可以根据需要进行更改)和JPA。

编辑:

至于现在我有一个表,一个文本值字段。我在服务器端将值转换为数据库/从数据库转换值。由于该项目刚刚启动,现在改变的模式将比未来更不痛苦,因此我正在考虑存在更好的方法。

+2

**为什么**需要存储与多种不同类型相同的值 - 您希望通过这样做来达到什么目的?为什么特定的值可能会有多种不同的类型? – 2012-01-16 10:21:59

+0

这有点令人困惑;如果你正在尝试这样做,因为这个值可以是不同的类型,那么我会建议使用VarChar;因为存在将其转换为其他数据类型的转换功能。 – 2012-01-16 10:48:46

+0

@MarkBannister:我的头顶:企业可能有应用程序/上下文使用不同的值,例如pi。作为浮点数和固定小数点。也可能是不同的舍入算法,例如在3分钟截断,银行家舍入到3分钟。等等。 – onedaywhen 2012-01-16 11:17:32

回答

0

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

2

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

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

+0

感谢您的建议。我会熟悉它。 – 2012-01-17 08:14:51

+0

我会认为OP的原始设计比这个好一点。在同一列中存储不同的数据类型并不能很好地利用数据库。 – 2012-01-17 08:34:27

1

从评论,似乎其意图是对每个实体,每个属性将具有单独存储其

有一个名字:它被称为Entity-Attribute-Value model,简称EAV。

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

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

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

你可以在SO上找到使用eav标签的EAV相关问题。

相关问题