使用枚举**存储**行和列的DB名称是否过度杀伤?

时间:2012-02-19 00:05:19

标签: java database enums

使用枚举而不是文字来引用表和列的名称是一个好习惯吗?或者它只是矫枉过正?

E.g。
而不是这样做:

executeQuery("SELECT name, age FROM people WHERE id = '23';");

做这样的事情:

executeQuery("SELECT "+COLUMN.NAME.getName()+", "+COLUMN.AGE.getName()+
  "FROM "+ TABLE.PEOPLE.getName()+" WHERE "+COLUMN.ID.getName()+" = '23';");

有这个枚举

public Enum COLUMN{
     NAME("name"),
     AGE("age"),
     ID("id");
     //...
}

那么当DB的结构还没有真正定义好但是你的承诺开始使用那个尚未定义的DB来开发代码时呢?

5 个答案:

答案 0 :(得分:3)

我个人称之为矫枉过正。这就是所谓的“软编码”,当你把它放得太远时,就像硬编码一样糟糕。可能更糟糕的是,因为它的缺点更加微妙 - 对于那些一遍又一遍地听到硬编码的“邪恶”的人来说,这是非常诱人的。

考虑年龄栏名称发生变化时会发生什么。你有一个枚举,其值不再与列的名称相对应(阅读:代码对你说谎),或者你必须通过并改变对COLUMN.AGE的每个引用来改为使用COLUMN.NEW_NAME_FOR_AGE(阅读:你没有保存自己以后不得不编辑代码,这可能是你考虑这个问题的最大原因)。如果结构发生变化,那甚至都不会发生。如果列移动到另一个表或其他内容,则您的枚举根本无法正常处理。

如果您真的对DB没有任何控制权,或者使用存储过程并让DB处理列名的详细信息,那么您应该将列的名称作为类的私有静态成员。 / p>

哦,并与任何要求您针对尚未设计的数据库进行编码的人进行讨论。你至少可以把一些事情搞得一团糟。如果没有,那么一定要去存储的proc路由,让他们担心在事情发生变化时正确地获取列名。

答案 1 :(得分:0)

请改用存储过程。让数据库担心所有的SQL,并让你的代码担心它将如何处理数据。

我通常的方法是让一个专门用于与数据库交互的类(通常是静态的)。每个存储过程在类中都有自己的静态方法。

答案 2 :(得分:0)

在这里使用枚举是一种巨大的过度杀伤,它会使你的代码更难以读写。

如果您担心有太多代码直接与数据库进行交互(如果您不是,那么您可能应该这样做),更好的方法是使用ORM。

答案 3 :(得分:0)

使用这种方法,当您更改架构时,您可以减少工作量,并且在编写查询时可以完成更多工作。就这么简单。

根据我对我编写的应用程序(web-apps)的经验,我不会这样做。这是判断决定。

作为旁注,您不必使用枚举。你可以使用你想要的任何常数。

答案 4 :(得分:0)

YES枚举可以是组织表格和快速枚举列名称的好方法。例如在cassandra我做:

public class EventSchema
{
    public static enum EVENTS {
        TYPE_ID("type_id"),
        SLICE_START_TIME("slice_start_time"),
        EVENT_TIME("event_time"),
        EVENT_ID("event_id"),
        EVENT_PAYLOAD("event_payload");

        public final static String TABLE_NAME = "events";
        public final String COLUMN_NAME;
        EVENTS (String name) {COLUMN_NAME = name;}
        public String toString () {return COLUMN_NAME;}
        public static String[] names () {
            return Arrays.toString(values()).replaceAll("\\[|]", "").split(", ");
        }
    }

    public void addEvent (String keyspace, String typeId, long timeSliceStart, long timeSliceDuration, Event event) {
        Object[] values = {typeId, timeSliceStart, event.getTime(), event.getId(), event.getDetails()};
        Statement stmt = QueryBuilder.insertInto(EVENTS.TABLE_NAME).values(EVENTS.names(), values);
        getSession(keyspace).execute(stmt);

    }
}