Что лучший способ состоит в том, чтобы сохранить значение из списка предопределенных значений в базе данных?

Скажем, у меня есть предопределенный список значений (RW, FW, 4 Вт) представляющий тип дисков механизма:

RW - Заднее колесо

FW - Передний Wheet

Колесо на 4 Вт - четыре

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

До моего знания я могу выполнить это с помощью любого из следующих методов:

- Твердый код значения в UI так, чтобы UI показал выпадающему наличию только вышеупомянутые 3 значения. Затем хранилище то значение в String vehicleType поле Vehicle vehicle возразите и затем сохраните его в DB как String.

  • Недостатки:

    i). Никакая проверка значения на уровне объектов

    ii). Никакая проверка значения на уровне DB.

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

    - Профессионалы:

    i). Никакая потребность join в DB для получения vehicle объект

ИЛИ

  • Сделайте отдельную таблицу VEHICLE_TYPE в DB, имеющем все 3 значения и ссылку это с VEHICLE таблица через. внешний ключ. И затем заполните выпадающее в UI от VEHICLE_TYPE таблица. Сохраните значение в vehicle объект как String

    - Недостатки:

    i). Никакая проверка на уровне объектов

    ii). Потребность a join в DB для получения a vehicle объект

    - Профессионалы:

    i). проверка значения на уровне DB (внешним ключом)

    ii). Пользователь может добавить новое значение к списку во времени выполнения

ИЛИ

  • Сделайте отдельную таблицу VEHICLE_TYPE в DB, имеющем все 3 значения, но, не связывают его с VEHICLE таблица через. внешний ключ. И затем заполните выпадающее в UI от VEHICLE_TYPE таблица. Сохраните значение в vehicle возразите и в DB как String

    - Недостатки:

    i). Никакая проверка на уровне объектов

    ii). Никакая проверка на уровне DB

    - Профессионалы:

    i). Нет join требуемый на уровне DB

    ii). Пользователь может добавить новое значение к списку

ИЛИ

  • Сделайте отдельную таблицу VEHICLE_TYPE в DB, имеющем все 3 значения и ссылку это с VEHICLE таблица через. внешний ключ. И затем заполните выпадающее в UI от VEHICLE_TYPE таблица. Сделайте enum VehicleType в Java и затем добавляют поле VehicleType vehicleType в Vehicle класс. Сохраните значение от VehicleType перечисление в vehicleType поле на основе входа пользователя.

    - Недостатки:

    i). Должен будет обновить список в двух местах: VehicleType перечисление и VEHICLE_TYPE таблица. Может вызвать несоответствие.

    ii). Пользователь не может добавить новое значение к списку (он может добавить значение в таблице, но не может изменить перечисление),

    - Профессионалы:

    i). проверка на уровне UI

    ii). проверка на уровне объектов

    iii). проверка на уровне DB

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

5
задан Yatendra Goel 22 June 2010 в 14:26
поделиться

4 ответа

Конечно. Ваш второй с модификацией:

Создайте отдельную таблицу VEHICLE_TYPE в БД, имеющую все 3 значения, и свяжите ее с таблицей VEHICLE через. внешний ключ. Затем заполните раскрывающийся список в пользовательском интерфейсе из таблицы VEHICLE_TYPE . Сохраните значение в объекте транспортного средства как String . При вызове vehicle.setVehicleType () проверьте правильность присвоенного значения, проверив возможные значения из БД. Если он недействителен, выбросить InvalidArgumentException или подкласс.

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

2
ответ дан 14 December 2019 в 18:58
поделиться

Я бы тоже выбрал второй подход. Вам уже ответили на первый вопрос.

Что касается второго, если производительность так важна, вы можете использовать один из этих подходов:

  1. Если тип транспортного средства не часто используется в приложении, лень загружать тип транспортного средства.

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

1
ответ дан 14 December 2019 в 18:58
поделиться

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

То, как вы поступаете с дополнительными значениями, введенными пользователем, зависит от того, как вы хотите, чтобы они обрабатывались:

  1. Рассматривайте их как истинные дополнительные значения. Они добавляются к VEHICLE_TYPE в базе данных и после добавления становятся доступными для выбора всеми пользователями.

  2. Рассматривайте их как пользовательские значения для этого конкретного поля. Т.е. VEHICLE_TYPE включает тип «Другое», и пользователь может ввести дополнительные данные в отдельное поле. Они не передаются другим пользователям и не отображаются в раскрывающемся списке.

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

Вы можете сохранить идентификатор транспортного средства как обычный ключ или как строку типа (RW, FW и т. Д.). Если вы используете саму строку типа, вам не нужно присоединяться к таблице VEHICLE_TYPE. Вы можете представить строку напрямую или вы можете получить строки презентации из пакетов ресурсов, если требуется локализация.

РЕДАКТИРОВАТЬ: Чтобы узнать, как ORM и OIM могут передавать метаданные проверки модели обратно в базу данных и выводить их в пользовательский интерфейс, см. DZone: Hibernate 4 Validation и Metawidget .С JSR 303 вы можете проверять свои объекты в пользовательском интерфейсе, на бизнес-уровне и в серверной части.

1
ответ дан 14 December 2019 в 18:58
поделиться

Создайте отдельную таблицу Vehicle_type (Vehicle_type_id int, description varchar (вам нужно определить подходящий размер)), чтобы использовать ее в качестве поиска для раскрывающегося меню. Если вы хотите, чтобы значение изменялось в основной таблице при изменении поиска (скажем, adimin меняет seden на седан), сохраните typeid в таблице транспортных средств. Если вы хотите, чтобы это были исторические данные (возможно, тип седан больше не существует, но старые автомобили по-прежнему должны быть помечены как седан), сохраните описание типа в таблице транспортных средств. Во втором случае вы не можете применить отношение FK, поэтому вам нужно будет убедиться, что вставки (и обновления только этого значения) не могут выбирать значения, которых в настоящее время нет в таблице. Приложение, скорее всего, сделает это, хотя вы можете написать триггер для этого, если значения могут измениться за пределами приложения.

1
ответ дан 14 December 2019 в 18:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: