我需要存储不同类型的相同值。值可以表示DATE,INT,BOOLEAN,DOUBLE和任何其他类型。我想知道是否有可能不使用多个表 - 每个表用于不同的类型(我认为它会使存储的值的使用大大复杂化(主要是搜索,过滤))。当存储多个列表并且主要是NULL值时,它会是一个很大的存储和性能下降吗?
我正在考虑使用这样的示例列的表,其中只填充一个值列:
id valueVarchar valueDate valueBoolean valueInt valueDouble
如果这种方法明显错误,请赐教。
我正在使用MySQL(InnoDB)创建JSF应用程序(数据库不是大问题,必要时可以更改)和JPA。
修改
至于现在,我有一个带有一个文本值字段的表。我在服务器端将值转换为数据库或从数据库转换。因为该项目刚刚开始,现在改变模型将比未来更少痛苦,我正在考虑存在更好的方法。
答案 0 :(得分:2)
如果您使用的是EclipseLink,则可以使用@TypeConverter将任何数据类型转换为String。您还可以使用两个第一列作为值,另一列作为值的类型,您可以使用@Transformation映射进行映射。
使用通用JPA,您可以使用属性访问权限通过get / set方法转换类型。
答案 1 :(得分:1)
从评论中可以看出,对于每个实体,每个属性都会单独存储值。
有一个名称:它被称为Entity-Attribute-Value model,或简称为EAV。
虽然有些情况下EAV是唯一适用的解决方案,但它的使用通常被认为是一种可行的替代品可用的反模式。
可以找到不恰当实施EAV数据库的案例研究here。
可以使用EAV的最明显的目的之一是在关系数据库中持久保存来自OO设计的对象数据。如果您希望如何使用它,我建议您考虑Object-Relational Mapping(简称ORM)。
您可以使用eav标记在SO上找到与EAV相关的问题。
答案 2 :(得分:0)
您可以将任何内容存储为二进制值,并转换为客户端类型。但是在查询条件下很难有效地使用该值。