Хранение перечислений в базе данных MySQL - PullRequest
6 голосов
/ 26 ноября 2011

Мне нужно самое чистое и эффективное решение для моего случая. Я пытаюсь хранить Оценки ученика в БД MySQL. Студент может быть "ОТСУТСТВУЮЩИМ" или "КОПИРОВАТЬ", я хочу сохранить эту информацию также в БД.

Я думал о назначении кодов для вышеуказанного случая, таких как -1 для ABSENT, -2 для COPY CASE и т. Д. Эти коды будут храниться только в столбце Метки.

Более того, когда я читаю их с помощью запроса выбора, я должен получить их отображаемые значения, т.е. только ABSENT, COPY CASE и т. Д.

Можно ли достичь всего этого только в конце БД?

Или мне нужно реализовать эти вещи только на уровне приложения?

Есть ли какие-либо API-интерфейсы, доступные для Java для такой функциональности?

Ответы [ 5 ]

6 голосов
/ 26 ноября 2011

mysql поддерживает перечисления:

CREATE TABLE students (name varchar(64), mark ENUM('ABSENT','COPY CASE' ));
INSERT INTO students VALUES ('john', 'COPY CASE');

В java этот столбец можно рассматривать как столбец строкового типа, но в базе данных значения сохраняются эффективно и при попытке сохранить значение, не содержащееся вenum приведет к ошибке.

4 голосов
/ 26 ноября 2011

как насчет сохранения его name() (строковая версия) в БД и создания его обратно при чтении из БД с использованием valueOf()

1 голос
/ 26 ноября 2011

Я думал о сохранении кодов для вышеуказанного случая, таких как -1 для ABSENT, -2 для COPY CASE и т. Д. Эти коды будут храниться только в столбце Метки.

Я быпредпочтительнее иметь отдельный столбец, скажем status, который содержит значения, такие как ABSENT, COPY CASE, и значение по умолчанию, такое как APPEARED

, а столбец меток будет оставаться отдельным.

В слое вида вы можете сделать что-то вроде

if(status is 'APPEARED')
show marks field
else
show status field
1 голос
/ 26 ноября 2011

Если строковые представления перечислений довольно строковые, а база данных большая (часто проверяются эти перечисления), я бы, вероятно, сопоставил каждое перечисление с целочисленной константой (нет, не ordinal(), а ваша собственная).пользовательское целочисленное значение) и имеют методы для перечисления, чтобы получить и создать перечисление из этих значений.Таким образом, вы сможете довольно эффективно хранить перечисления.

public enum Status {

  ABSENT(1), COPY_PASTE(2);

  int value;

  private Status(int value) {
      this.value = value;
  }

  public int getValue() {
      return this.value;
  }

  public static Status ofStatusCode(int value) {
      // retrieve status from status code
  }

}
0 голосов
/ 26 ноября 2011

MySQL имеет свой собственный ENUM тип . И, как указал @Jigar, вы можете использовать Enum.getName, чтобы получить Java String, представляющую перечисление для персистентности, получить поле из базы данных в виде String и использовать Enum.valueOf, чтобы загрузить константу enum обратно.

Вы также можете использовать Enum.ordinal() + 1, чтобы получить целое число для персистентности (MySQL также поддерживает использование целочисленных индексов напрямую с типом ENUM) и выполнить запрос, подобный:

SELECT enum_col-1 FROM tbl_name;

для получения порядкового номера возврата (он получит -1 для строк с недопустимыми значениями enum).

Plus MyEnumType value = MyEnumType.values()[ordinal] для преобразования его в тип перечисления Java.

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

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