将枚举存储在数据库

时间:2016-04-08 19:46:40

标签: java database postgresql

我有一个数据库,用于在大学任职的招聘广告网络应用程序。 我在数据库中有很多枚举值,例如城市名称,广告类别或语言列表。 部分数据库: enter image description here

我的目标是阻止用户通过输入发送并创建一些无效数据,例如我们想要像' LA'," L.A。"和"洛杉矶"由city表中的一个ID表示。 我还认为将它存储在数据库表中是个好主意,因为使用给定的值集,我可以将它们视为标记,这样可以改善搜索过程。此外,很容易扩展这些值,例如,添加新语言列表。

不幸的教授说这不是最佳解决方案,所以我的问题是在上述情况下存储易于扩展的枚举值列表的最佳方法是什么?

我正在使用PostgreSQL,应用程序将使用在Glassfish上运行的Java EE构建。

1 个答案:

答案 0 :(得分:6)

虽然从纯粹的架构角度看似乎有意义,但我会将其归类为数据库设计反模式。从根本上说,这是对枚举的不恰当使用。您明显的目标是通过强制用户从正确值列表中进行选择来防止用户输入错误值。虽然高贵,但你的目标最终是有缺陷的,原因如下:

  1. 维护地球上每个城市的准确清单超出了DBA的范围。城市比你想象的更加规律,没有简单的综合清单可供你复制。

  2. 由于无法维护全面的列表,您和/或您的应用程序将需要一种机制来输入新值。这将破坏您保证正确价值的目标。

  3. 这是对数据库架构的过度规范化。你真的不想只是为了确定单个信息领域的价值而进行复杂的连接。

  4. 替代解决方案是维护已知商品名称列表,并使用自动完成功能建议已知正确的值,但允许您的用户输入不在列表中的新值。不要将城市存储为枚举,而是将其直接与其余的逻辑分组数据一起存储。