Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Вы могли выполнить все свои запросы против представления, которое содержит WHERE IS_DELETED='0'
пункт.
используйте представление, функцию или процедуру, которая проверяет is_deleted=0, т.е. не выбирают непосредственно на таблице в случае, если таблица должна измениться позже по другим причинам
и индексировать is_deleted столбец для больших таблиц
, так как у Вас уже есть журнал аудита, отслеживание даты удаления избыточно
Я предпочитаю сохранять столбец состояния, таким образом, я могу использовать его для нескольких различных конфигураций, т.е. опубликованный, частный, удаленный, needsAproval...
Вы не упоминаете, какой продукт, но SQL Server 2008 и postgresql (и другие я уверен) позволяют Вам создавать фильтрованные индексы, таким образом, Вы могли создать закрывающий индекс где is_deleted=0, смягчив некоторые отрицательные стороны этого конкретного подхода.
У Вас определенно будет лучшая производительность при перемещении удаленных данных в другую таблицу как Jim, сказанный, а также запись наличия того, когда это было удалено, почему, и кого.
Добавление where
ко всем Вашим запросам значительно замедлит их и препятствует использованию любого из индексов, которые Вы можете иметь на таблице. Постарайтесь не иметь "флаги" в своих таблицах, когда это возможно. deleted
=0
Что-то, что я использую на проектах, является statusInd tinyint не пустое значение по умолчанию 0 столбцов с помощью statusInd, поскольку битовая маска позволяет мне выполнять, управление данными (удалите, заархивируйте, копируйте, восстановите, и т.д.). Используя это в представлениях я могу тогда сделать распределение данных, публикацию, и т.д. для приложений потребления. Если производительность является беспокойством относительно представлений, маленькие таблицы фактов использования для поддержки этой информации, отбрасывая факт, отбрасывает отношение и допускает масштабируемый, удаляет.
Масштабы хорошо и информационно-центрическое хранение довольно маленького места данных - ключ для 350 ГБ + dbs с проблемами в реальном времени. Используя альтернативы, таблицы, триггеры имеют немного служебные, который в зависимости от потребности может или не может работать на Вас.
связанные с SOX Аудиты могут потребовать, чтобы больше, чем поле помогли в Вашем случае, но это может помочь. Наслаждайтесь
Это зависит, на какой информации Вам нужно и какие рабочие процессы Вы хотите поддерживать.
Делают Вы хотите быть в состоянии к:
, Если запись была удалена и восстановила после удаления четыре раза, он достаточный для Вас, чтобы знать, что это в настоящее время находится в восстановленном после удаления состоянии, или сделайте Вы хотите быть в состоянии сказать то, что произошло тем временем (включая любые редактирования между последовательными удалениями!)?
Лучший ответ, к сожалению, зависит от того, что Вы пытаетесь выполнить со своими мягкими удалениями и базой данных, в которой Вы реализуете это.
В SQL Server, лучшее решение состояло бы в том, чтобы использовать deleted_on/deleted_at столбец с типом SMALLDATETIME или ДАТЫ И ВРЕМЕНИ (в зависимости от необходимой гранулярности) и сделать тот столбец nullable. В SQL Server данные заголовка строки содержат ПУСТУЮ битовую маску для каждого из столбцов в таблице, таким образом, это незначительно быстрее для выполнения, ЯВЛЯЕТСЯ ПУСТЫМ или NOT NULL, чем это должно проверить значение, сохраненное в столбец.
, Если у Вас есть большой объем данных, Вы захотите изучить разделение Ваших данных, или через саму базу данных или через две отдельных таблицы (например, продукты и ProductHistory) или посредством индексного представления.
я обычно избегаю полей признака как is_deleted, is_archive, и т.д. потому что они только несут одну часть значения. nullable deleted_at, archived_at поле обеспечивает дополнительный уровень значения себе и тому, кто бы ни наследовал Ваше приложение. И я избегаю полей битовой маски как чумы, так как они требуют понимания того, как битовая маска была создана для схватывания любого значения.
если таблица является большой, и производительность является проблемой, можно всегда перемещать 'удаленные' записи на другую таблицу, которая имеет дополнительную информацию как время удаления, кто удалил запись, и т.д.
тот способ, которым Вы не должны добавлять другой столбец к своей первичной таблице
Столбец Having is_deleted
является довольно хорошим подходом. Если бы это находится в Oracle, для дальнейшего увеличения производительности я рекомендовал бы делить таблицу путем создания раздела списка на is_deleted
столбец. Тогда удаленные и неудаленные строки физически будут в различных разделах, хотя для Вас это будет прозрачно.
В результате при вводе запроса как
SELECT * FROM table_name WHERE is_deleted = 1
тогда Oracle выполнит 'сокращение раздела' и только изучит соответствующий раздел. Внутренне раздел является различной таблицей, но это прозрачно для Вас как пользователь: Вы будете в состоянии выбрать через всю таблицу, неважно, если она будет разделена или нет. Но Oracle будет в состоянии запросить ТОЛЬКО раздел, в котором она нуждается . Например, давайте предположим, что у Вас есть 1 000 строк с is_deleted = 0
и 100 000 строк с is_deleted = 1
, и Вы делите таблицу на is_deleted
. Теперь при включении условия
WHERE ... AND IS_DELETED=0
тогда, Oracle ТОЛЬКО просканирует раздел с 1 000 строк. Если бы таблица не была разделена, она должна была бы просканировать 101 000 строк (оба раздела).
Я склонился бы к "Направляющим путь" с deleted_at
столбец, который содержит дата и время того, когда удаление произошло . Тогда Вы получаете определенные свободные метаданные об удалении. Для Вашего SELECT
просто получают строки WHERE deleted_at IS NULL