Использование перечислений для ** хранения ** имен БД строк и столбцов является излишним? - PullRequest
4 голосов
/ 19 февраля 2012

Является ли хорошей практикой использование перечислений вместо литералов для ссылки на имена таблиц и столбцов? или это просто перебор?

* 1003 Е.Г. * Вместо этого:

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");
     //...
}

А как насчет того, когда структура БД еще не очень хорошо определена, но вы обязаны начать разработку кода с использованием этой еще не определенной БД?

Ответы [ 5 ]

3 голосов
/ 19 февраля 2012

Я бы лично назвал это излишним.Это так называемое «мягкое кодирование», которое так же плохо, как и жесткое кодирование, когда вы заходите слишком далеко.Возможно, еще хуже, потому что его вредность более тонкая - и это довольно заманчиво для людей, которые много раз слышали о «пороках» жесткого кодирования.

Подумайте, что происходит, когда имя столбца возраста изменяется.У вас либо перечисление, значения которого больше не соответствуют именам столбцов (читай: код лжёт вам), либо вам нужно пройти и изменить каждую ссылку на COLUMN.AGE, чтобы использовать вместо нее COLUMN.NEW_NAME_FOR_AGE (читай: у вас естьне избавили себя от необходимости редактировать код позже, что, вероятно, является главной причиной, по которой вы это рассматриваете).И это даже не касается того, что произойдет, если структура изменится.Если столбец перемещается в другую таблицу или что-то еще, ваши перечисления просто не могут справиться, как есть.

Возможно, вы должны иметь имена столбцов как частные статические члены класса, если вы действительно этого не имеетелюбой контроль над БД, или использовать хранимую процедуру и позволить БД обрабатывать специфику имен столбцов.

О, и поговорить с тем, кто попросил вас кодировать базу данных, которая еще даже не разработана,Вы, по крайней мере, сможете установить некоторые вещи в камне.Если нет, то определенно пройдите по маршруту сохраненных процедур и дайте им побеспокоиться о том, чтобы имена столбцов были правильными, когда все меняется.

0 голосов
/ 28 февраля 2014

YES перечисления могут быть отличным способом упорядочить ваши таблицы и быстро перечислить имена столбцов.например в Кассандре я делаю:

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);

    }
}

0 голосов
/ 19 февраля 2012

Использование перечислений здесь является огромным излишним, и это делает ваш код намного сложнее для чтения и записи.

Если вас беспокоит слишком большой объем кода, взаимодействующего напрямую с базой данных (что, еслинет, вероятно, так и должно быть), гораздо лучше использовать ORM.

0 голосов
/ 19 февраля 2012

Хм, при таком подходе у вас меньше работы при изменении схемы, и у вас больше работы при написании запросов. Это так просто.

Исходя из моего опыта с теми приложениями, которые я пишу (веб-приложения), я бы не стал этого делать. Это решение суда.

В качестве дополнительного примечания вам не нужно использовать перечисления. Вы можете использовать любой вид константы, какой захотите.

0 голосов
/ 19 февраля 2012

Используйте вместо этого хранимые процедуры.Позвольте базе данных беспокоиться обо всем SQL, и пусть ваш код беспокоится о том, что он собирается делать с данными.

Мой обычный подход состоит в том, чтобы иметь класс (обычно статический), предназначенный для взаимодействия с базой данных.Каждая хранимая процедура получает свой собственный статический метод в классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...