您好,我建模一个实体与一个列命名为“性别”。在应用程序代码中,性别应为(Java)枚举类型,具有两个值(男性和女性)。知道枚举作为数据类型不是通用SQL (语言) 92的一部分,您将如何对其进行建模。
数据模型必须是可移植的,才能被几个DBMS (Mysql、Oracle、Derby)和几个持久化提供者(JPA、Hibernate、JDBC)使用。我觉得,它涉及到两个级别:-第一个模式和实体级别(将枚举存储为-VAR-CHAR或INT) -第二个应用代码级别(JDBC不支持枚举,JPA支持,但这取决于实现)
例如,是否有适用于Mysql DBMS的通用解决方案?谢谢!!
发布于 2012-04-02 22:22:51
我通常采用以下解决方案,它给出了一个完全规范化的数据库模式。
Colour。该表有两列:int、smallint或tinyint.相同的varchar
在database.
Colour表的记录的"Data“表,实现一个用于插入记录的存储过程,该过程接受Colour字符串值(如您的Java enum所描述的);例如,创建一个Colour表。将过程dbo.InsertRecord @colour (32)创建为...
存储过程将执行必要的字符串到int的转换,允许您的数据表通过int外键引用Colour表。
类似地,您可以在您的数据表上创建一个视图,该视图将在幕后连接到Colour表,以将数据的非规范化via呈现回应用程序或最终用户。
存储过程方法的替代方法是在启动时读取并缓存应用程序中的序号名称映射。这样做的好处是能够与数据库中Colour表的内容相比较来验证Java Colour枚举的完整性。
发布于 2012-04-02 22:22:12
枚举至少有两个属性可用来标识它们:序号(实例在枚举列表中的位置)和名称。两者都可以存储在数据库中,并用于检索正确的枚举实例。
如果你使用像Hibernate这样的or映射器,它会帮你做到这一点,否则你需要手动将枚举转换为整数/长整型或字符串,反之亦然。
为了更安全,您可以向枚举添加一个自定义属性,并为该属性提供一个getter和一个转换函数-> enum value。这样,只要不更改id属性,您就可以自由地对枚举值进行重新排序和重命名。
https://stackoverflow.com/questions/9978089
复制相似问题