Пустые указатели в реляционной базе данных хорошо?

Это помогло мне. Я изменил тип возвращаемого значения List на java.util.List.

Как перехватить возвращаемый тип List с помощью выражения точечного вырезания AOP

@Aspect
@Component
public class MyItemDaoLoggingAspect {

    //this is wher we add all aspect logic 

    //@Before advice

    @Before("execution(public java.util.List getAllItems())")
    public void beforeVaalidateMyItem() {
        System.out.println(" ========> In MyItemDaoLoggingAspect");
        System.out.println(" ========> Executing beforeAscpect for validateMyItem");
    }
}

69
задан 3 revs, 3 users 100% 2 October 2008 в 17:25
поделиться

6 ответов

NULL означает отсутствие значения, а 0 - нет, если вы видите 0, вы не знаете значение, если вы видите NULL, вы знаете, что это пропущенное значение

Я думаю, значения NULL намного понятнее, 0 и '' сбивают с толку, поскольку они не ясно показывают цель сохраненного значения

2
ответ дан 24 November 2019 в 13:32
поделиться

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

  • Ничто не может быть равным нулю, и ничто не может быть равным нулю, больше или меньше нуля, поэтому вы должны установить пустое значение в качестве заполнителя, если хотите выполнить какое-либо массовое сравнение.

  • Это также проблема для составных ключей, которые могут использоваться в соединении. В тех случаях, когда естественный ключ содержит столбец, допускающий значение NULL, вы можете рассмотреть возможность использования синтетического ключа.

  • Нули могут выпадать из числа, что может не соответствовать желаемой вами семантике.

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

Есть довольно много других тонкостей для нулей. SQL for Smarties Джо Селко содержит целую главу по этому вопросу и является хорошей книгой, которую стоит прочитать в любом случае. Некоторые примеры мест, где нулевые значения являются хорошим решением:

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

  • Столбцы, которые вы можете использовать для обнуления, чтобы пропустить отсчеты.

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

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

  • «Не записано» значения в кодовых полях с FK против справочной таблицы. Используйте значение местозаполнителя, чтобы вы (или какой-то случайный бизнес-аналитик) не случайно удалили строки из наборов результатов при выполнении запроса к базе данных.

  • Описание полей, где ничего не было введено - пустая строка ( '' ) отлично подходит для этого. Это избавляет от необходимости рассматривать пустые значения как особый случай.

  • Дополнительные столбцы в системе отчетов или хранилища данных. В этой ситуации создайте строку-заполнитель для параметра «Не записано» в измерении и присоединитесь к нему. Это упрощает запросы и хорошо работает со специальными инструментами отчетности.

Опять же, книга Челко является хорошим подходом к предмету.

При выполнении запроса к базе данных непреднамеренно удаляются строки из наборов результатов.

  • Поля описания, в которые ничего не было введено - пустая строка ( '' ) отлично подходит для этого. Это избавляет от необходимости рассматривать пустые значения как особый случай.

  • Дополнительные столбцы в системе отчетов или хранилища данных. В этой ситуации создайте строку-заполнитель для параметра «Не записано» в измерении и присоединитесь к нему. Это упрощает запросы и хорошо работает со специальными инструментами отчетности.

  • Опять же, книга Челко является хорошим подходом к предмету.

    При выполнении запроса к базе данных непреднамеренно удаляются строки из наборов результатов.

  • Поля описания, в которые ничего не было введено - пустая строка ( '' ) отлично подходит для этого. Это избавляет от необходимости рассматривать пустые значения как особый случай.

  • Дополнительные столбцы в системе отчетов или хранилища данных. В этой ситуации создайте строку-заполнитель для параметра «Не записано» в измерении и присоединитесь к нему. Это упрощает запросы и хорошо работает со специальными инструментами отчетности.

  • Опять же, книга Челко является хорошим подходом к предмету.

  • Дополнительные столбцы в системе отчетов или хранилища данных. В этой ситуации создайте строку-заполнитель для параметра «Не записано» в измерении и присоединитесь к нему. Это упрощает запросы и хорошо работает со специальными инструментами отчетности.

  • Опять же, книга Челко является хорошим подходом к предмету.

  • Дополнительные столбцы в системе отчетов или хранилища данных. В этой ситуации создайте строку-заполнитель для параметра «Не записано» в измерении и присоединитесь к нему. Это упрощает запросы и хорошо работает со специальными инструментами отчетности.

  • Опять же, книга Челко является хорошим подходом к предмету.

    6
    ответ дан 24 November 2019 в 13:32
    поделиться

    Не стоит недооценивать сложность, которую вы создаете, делая поле NULLable. Например, следующее предложение where выглядит так, как будто оно будет соответствовать всем строкам (биты могут быть только 1 или 0, верно?)

    where bitfield in (1,0)
    

    Но если битовое поле NULLable, оно пропустит некоторые. Или возьмите следующий запрос:

    select * from mytable
    where id not in (select id from excludetable)
    

    Теперь, если исключаемая таблица содержит ноль и a 1, это переводится в:

    select * from mytable
    where id <> NULL and id <> 1
    

    Но «id <> NULL» является ложным для любого значения id, поэтому он никогда не вернет никаких строк. Это удивляет даже опытных разработчиков баз данных.

    Учитывая, что NULL может застать большинство людей врасплох, я стараюсь избегать этого, когда могу.

    недооценивать сложность, которую вы создаете, делая поле пустым. Например, следующее предложение where выглядит так, как будто оно будет соответствовать всем строкам (биты могут быть только 1 или 0, верно?)

    where bitfield in (1,0)
    

    Но если битовое поле NULLable, оно пропустит некоторые. Или возьмите следующий запрос:

    select * from mytable
    where id not in (select id from excludetable)
    

    Теперь, если исключаемая таблица содержит ноль и a 1, это переводится в:

    select * from mytable
    where id <> NULL and id <> 1
    

    Но «id <> NULL» является ложным для любого значения id, поэтому он никогда не вернет никаких строк. Это удивляет даже опытных разработчиков баз данных.

    Учитывая, что NULL может застать большинство людей врасплох, я стараюсь избегать этого, когда могу.

    недооценивать сложность, которую вы создаете, делая поле NULLable. Например, следующее предложение where выглядит так, как будто оно будет соответствовать всем строкам (биты могут быть только 1 или 0, верно?)

    where bitfield in (1,0)
    

    Но если битовое поле NULLable, оно пропустит некоторые. Или возьмите следующий запрос:

    select * from mytable
    where id not in (select id from excludetable)
    

    Теперь, если исключаемая таблица содержит ноль и a 1, это переводится в:

    select * from mytable
    where id <> NULL and id <> 1
    

    Но «id <> NULL» является ложным для любого значения id, поэтому он никогда не вернет никаких строк. Это удивляет даже опытных разработчиков баз данных.

    Учитывая, что NULL может застать большинство людей врасплох, я стараюсь избегать этого, когда могу.

    select * from mytable
    where id not in (select id from excludetable)
    

    Теперь, если исключаемая таблица содержит ноль и 1, это переводится в:

    select * from mytable
    where id <> NULL and id <> 1
    

    Но «id <> NULL» является ложным для любого значения id, так что это никогда не вернет никаких строк. Это удивляет даже опытных разработчиков баз данных.

    Учитывая, что NULL может застать большинство людей врасплох, я стараюсь избегать этого, когда могу.

    select * from mytable
    where id not in (select id from excludetable)
    

    Теперь, если исключаемая таблица содержит ноль и 1, это переводится в:

    select * from mytable
    where id <> NULL and id <> 1
    

    Но «id <> NULL» является ложным для любого значения id, так что это никогда не вернет никаких строк. Это удивляет даже опытных разработчиков баз данных.

    Учитывая, что NULL может застать большинство людей врасплох, я стараюсь избегать этого, когда могу.

    8
    ответ дан 24 November 2019 в 13:32
    поделиться

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

    Просто для того, чтобы сказать, как можно иметь имя, отчество, фамилию для каждого человека. (Отчество и фамилия указывать необязательно, тогда для вас будут NULL) а также как вы можете иметь факс, рабочий телефон, рабочий телефон для всех в списке блогов.

    NULL - это нормально, и вы должны правильно обрабатывать их при извлечении. В SQL Server 2008 существует концепция разреженных столбцов, в которой также можно избежать пространства, занимаемого для значений NULL.

    Не путайте NULL с нулями и другими значениями. Люди так делают, что любой говорят, что это правильно.

    Спасибо Навин

    2
    ответ дан 24 November 2019 в 13:32
    поделиться

    It seems that if null is valid within the context of the attribute, then it should be allowed.

    But what does null mean? That's the rub. It's "no value", but there's a dozen different reasons there might be no value there, and "null" doesn't give you any clue which one it means in this case. (Not set yet, not applicable to this instance, not applicable to this type, not known, not knowable, not found, error, program bug, ...)

    This is very common in Java where object references are often null.

    There's a school of thought that says null references there are bad there, too. Same problem: what does null mean?

    IIRC, Java has both "null" and "uninitialized" (though no syntax for the latter). So Gosling realized the folly of using "null" for every kind of "no value". But why stop with just two?

    0
    ответ дан 24 November 2019 в 13:32
    поделиться

    Как аналитик / программист с 30-летним опытом, я просто скажу, что NULL следует убрать назад и избавить от страданий.

    -1, 01.01.10001.12 / 31/9999 и? будет достаточно и без искажающего сознание кода, необходимого для обработки этих неприятных значений NULL.

    -2
    ответ дан 24 November 2019 в 13:32
    поделиться