Форум программистов, компьютерный форум, киберфорум
SQLite
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
2 / 2 / 0
Регистрация: 20.01.2018
Сообщений: 8

Поле БД, типа enum, которого может не быть

20.03.2018, 10:11. Показов 1470. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Например, есть класс человек, у него есть ф.и.о. Ну и как бы нормально - одна запись - один чел. Теперь представим, нет у человека отчества. Тоже ничего, просто пустая строка, "". Но теперь представим, отчества перечислены в enum, и могут принимать только из конкретных значений. Теперь как? Создать в enum что то типа Otchestvo.NULL или сделать отдельную таблицу "Отчества"? Как на практике обычно делается?

Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.03.2018, 10:11
Ответы с готовыми решениями:

"В поле может быть введено только одно слово, пробелы могут быть или не быть с начала слова и в конце"
Добрый вечер уважаемые форумчане. Подскажите как написать выражение со след условием: -в поле может быть введено только одно слово,...

Только константное статическое поле НЕ МОЖЕТ быть поле членом класса !
class CCoords { static const float rate = 1.0f; // ОШИБКА !!! bool IsComputed; float x,y; POINT2D ...

Добавить новое поле типа enum с помощью запросов SQL
Доброе время суток уважаемые знатоки! Я совсем не давно стал изучать язык SQL и у меня возникла проблема. Я использую MySQL версии...

4
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
20.03.2018, 10:40
Цитата Сообщение от Motokulman Посмотреть сообщение
Создать в enum
О какой СУБД идет речь? Данный тип есть далеко не везде.
По поводу ограниченного количества значений. Если их всего несколько, то можно перечислить в constraint (например, в Oracle check constraint). Если много, то лучше иметь таблицу-справочник, из которой пользователь в клиентской программе будет выбирать нужное.
1
2 / 2 / 0
Регистрация: 20.01.2018
Сообщений: 8
20.03.2018, 12:24  [ТС]
Это Sqlite и язык java. Я наверное сбил с толку. Вариантов значения примерно семь. Но возможна ситуация, когда оно не задано. Перекладывая на пример с отчествами, в enum задаю варианты: "Иванович", "Петрович" и "Без отчества". Немного будет сбивать с толку. Выборка:
Петров Иван Иванович
Сидоров Петр Без отчества

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

На ум приходит создать отдельную таблицу для отчеств. Но что если таких аттрибутов не только одно отчество? А еще ИНН у человека, где есть значение ИНН, но его может не быть, адрес по прописке,один единственный конкретный, либо его нет... И так далее. Обратите внимание, что работать приходится со значениями, которое есть только одно, либо его нет вовсе. Появляется множество таблиц, в которой есть только одно поле! Когда все это можно было бы положить в одну таблицу. Один класс, одна функция получить из базы, одна функция положить в базу. Но при этом придется работать с null, я и боюсь, где нибудь это приведет к падению программы.

Добавлено через 42 минуты
Мне посоветовали использовать null, а чтобы корректно с ним работать использовать типы-обертки (это java). Сейчас попробую... Сделаю одну таблицу, буду прописывать null если не задано значение.
0
476 / 239 / 114
Регистрация: 12.05.2016
Сообщений: 647
22.03.2018, 20:09
Не понимаю, зачем все себе тщательно и с упорством, достойным восхищения, раскладывают грабли с этим enum.

Чем не угодили отдельные таблицы со справочниками?
Простой, железобетонный подход. Не нарушает принципы реляционных БД.

Думаете база сломается от того, то вы в неё пару сотен лишних таблиц поместите? Ей по барабану, сколько в ней таблиц.
1
2 / 2 / 0
Регистрация: 20.01.2018
Сообщений: 8
22.03.2018, 21:20  [ТС]
Да, можно хоть сотню, только на каждую таблицу надо свою функцию добавить запись и функцию для чтения. Хотя, возможно, можно сделать проще, я просто не знаю как. Сейчас делаю так:

Сначала класс
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  public class UniversalPlatesGroup {
 
    private int id; // нужно, т.к. после создания группа м.б. удалена, и порячдок в листе поменяется, поэтому полагаться на порядок в листе нельзя
    private String name;
 
    public UniversalPlatesGroup(int id, String name) {
        this.id = id;
        this.name = name;
    }
 
    public int getId() {
        return id;
    }
 
    public String getName() {
        return name;
    }
 
}
Затем таблица и методы, в другом классе
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
            sql = "CREATE TABLE  if not exists GroupsOfUniversalPlates "
                    + "(ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
                    + " name  TEXT    NOT NULL)";  // имя группы, заданное пользователем
            stmt.executeUpdate(sql);
 
 // Добавление в таблицу новой группы перекрытий
    public void addUniversalPlatesGroup(String name) {
        // Создадим подготовленное выражение, чтобы избежать SQL-инъекций
        try (PreparedStatement statement = this.connection.prepareStatement(
                "INSERT INTO GroupsOfUniversalPlates(`name`) "
                + "VALUES(?)")) {
            statement.setObject(1, name);
            statement.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
 
    // Получение списка имеющихся групп перекрытий
    public List<UniversalPlatesGroup> getUniversalPlatesGroups() {
        try (Statement statement = this.connection.createStatement()) {
            List<UniversalPlatesGroup> products = new ArrayList<>();
            ResultSet resultSet = statement.executeQuery("SELECT id, name FROM GroupsOfUniversalPlates");
 
            while (resultSet.next()) {
                products.add(new UniversalPlatesGroup(
                        resultSet.getInt("id"),
                        resultSet.getString("name")));
            }
            return products;
        } catch (SQLException e) {
            e.printStackTrace();
            return Collections.emptyList();
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2018, 21:20
Помогаю со студенческими работами здесь

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

Поле не может быть изменено
class EDataBaseError with message field cannot be modified. Process stoped. Поле не может быть изменено, что нужно исправить?? Подскажите

Дан текст, каждый символ которого может быть...
Дан текст, каждый символ которого может быть малой буквой, цифрой или одним из знаков +,-,*. 1. Выяснить, встречается ли в данном текста...

Дан текст, каждый символ которого может быть малой буквой
Дан текст, каждый символ которого может быть малой буквой, цифрой или одним из знаков +,-,*. Группой букв будем называть такую...

Разветвление switch, может ли переменная быть любого типа
вопрос 1: если пишем switch(n), то переменная n может быть любого типа? вопрос 2: после switch(n) можно ли после case как-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru