Скажем, у меня есть предопределенный список значений (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
Вопрос: Есть ли другой путь, которым мы можем выполнить вышеупомянутую задачу, которая не имеет ни одного из вышеупомянутых недостатков?
Конечно. Ваш второй с модификацией:
Создайте отдельную таблицу VEHICLE_TYPE
в БД, имеющую все 3 значения, и свяжите ее с таблицей VEHICLE
через. внешний ключ. Затем заполните раскрывающийся список в пользовательском интерфейсе из таблицы VEHICLE_TYPE
. Сохраните значение в объекте транспортного средства как String
. При вызове vehicle.setVehicleType ()
проверьте правильность присвоенного значения, проверив возможные значения из БД. Если он недействителен, выбросить InvalidArgumentException
или подкласс.
Теперь у вас есть проверка в объекте. Кроме того, я не считаю необходимость присоединиться к мошенничеству. Вы ничего не можете сделать без присоединения к столам. Вот почему у вас много столов.
Я бы тоже выбрал второй подход. Вам уже ответили на первый вопрос.
Что касается второго, если производительность так важна, вы можете использовать один из этих подходов:
Если тип транспортного средства не часто используется в приложении, лень загружать тип транспортного средства.
Если вы не используете идентификаторы базы данных, потому что вы используете код типа автомобиля в качестве первичного ключа, вы можете добавить свойство codeType в класс автомобиля, и загружать это свойство вместо типа (который также может быть загружен лениво, в зависимости от потребностей), непосредственно из таблицы автомобилей. Тогда у вас не будет никакого соединения.
Я не думаю, что объединения должны вызывать у вас беспокойство - вы вполне можете обнаружить, что компромисс с дизайном для уменьшения накладных расходов на JOIN, скорее всего, будет потрачен впустую. Задержка вашей сети для базы данных может быть выше, чем накладные расходы JOIN.
То, как вы поступаете с дополнительными значениями, введенными пользователем, зависит от того, как вы хотите, чтобы они обрабатывались:
Рассматривайте их как истинные дополнительные значения. Они добавляются к VEHICLE_TYPE в базе данных и после добавления становятся доступными для выбора всеми пользователями.
Рассматривайте их как пользовательские значения для этого конкретного поля. Т.е. VEHICLE_TYPE включает тип «Другое», и пользователь может ввести дополнительные данные в отдельное поле. Они не передаются другим пользователям и не отображаются в раскрывающемся списке.
Чтобы получить проверку на уровне объекта, проверьте соответствие VEHICLE_TYPE. Это можно сделать автоматически с помощью современных фреймворков OIM и ORM. Это позволяет вам определять правила проверки для модели, которые затем передаются в пользовательский интерфейс для раннего обнаружения ошибок проверки и обратно в базу данных для обеспечения согласованности хранилища данных.
Вы можете сохранить идентификатор транспортного средства как обычный ключ или как строку типа (RW, FW и т. Д.). Если вы используете саму строку типа, вам не нужно присоединяться к таблице VEHICLE_TYPE. Вы можете представить строку напрямую или вы можете получить строки презентации из пакетов ресурсов, если требуется локализация.
РЕДАКТИРОВАТЬ: Чтобы узнать, как ORM и OIM могут передавать метаданные проверки модели обратно в базу данных и выводить их в пользовательский интерфейс, см. DZone: Hibernate 4 Validation и Metawidget .С JSR 303 вы можете проверять свои объекты в пользовательском интерфейсе, на бизнес-уровне и в серверной части.
Создайте отдельную таблицу Vehicle_type (Vehicle_type_id int, description varchar (вам нужно определить подходящий размер)), чтобы использовать ее в качестве поиска для раскрывающегося меню. Если вы хотите, чтобы значение изменялось в основной таблице при изменении поиска (скажем, adimin меняет seden на седан), сохраните typeid в таблице транспортных средств. Если вы хотите, чтобы это были исторические данные (возможно, тип седан больше не существует, но старые автомобили по-прежнему должны быть помечены как седан), сохраните описание типа в таблице транспортных средств. Во втором случае вы не можете применить отношение FK, поэтому вам нужно будет убедиться, что вставки (и обновления только этого значения) не могут выбирать значения, которых в настоящее время нет в таблице. Приложение, скорее всего, сделает это, хотя вы можете написать триггер для этого, если значения могут измениться за пределами приложения.