Я должен использовать ПУСТОЙ УКАЗАТЕЛЬ или пустую строку для представления данных в столбце таблицы?

Все зависит от того, что вы хотите сделать, и того, что вы хотите, чтобы производные классы могли видеть.

class A
{
private:
    int _privInt = 0;
    int privFunc(){return 0;}
    virtual int privVirtFunc(){return 0;}
protected:
    int _protInt = 0;
    int protFunc(){return 0;}
public:
    int _publInt = 0;
    int publFunc()
    {
         return privVirtFunc();
    }
};

class B : public A
{
private:
    virtual int privVirtFunc(){return 1;}
public:
    void func()
    {
        _privInt = 1; // wont work
        _protInt = 1; // will work
        _publInt = 1; // will work
        privFunc(); // wont work
        privVirtFunc(); // wont work
        protFunc(); // will work
        publFunc(); // will return 1 since it's overridden in this class
    }
}
27
задан Andy Lester 24 April 2014 в 18:48
поделиться

14 ответов

Я категорически не согласен со всеми, кто говорит для безусловного использования ПУСТОГО УКАЗАТЕЛЯ. Разрешение столбца быть ПУСТЫМ представляет дополнительное состояние, которое Вы не имели бы при установке столбца как NOT NULL. Не делайте этого, если Вам не нужно дополнительное состояние. Таким образом, если Вы не можете придумать различие между значением пустой строки и значением пустого указателя, затем настройте столбец как NOT NULL и используйте пустую строку для представления пустой. Представление того же самого двумя различными способами является плохой идеей.

большинство людей, которые сказали Вам использовать ПУСТОЙ УКАЗАТЕЛЬ также, дало пример, где ПУСТОЙ УКАЗАТЕЛЬ будет означать что-то другое, чем пустая строка. И в тех примерах, они правы.

Большую часть времени, однако, ПУСТОЙ УКАЗАТЕЛЬ является бесполезным дополнительным состоянием, которое просто вынуждает программистов должными быть обработать больше случаев. Как другие упомянули, Oracle не позволяет этому дополнительному состоянию существовать, потому что это рассматривает Пустую и пустую строку как то же самое (невозможно сохранить пустую строку в столбце, который не позволяет пустой указатель в Oracle).

31
ответ дан Greg Smalter 28 November 2019 в 04:17
поделиться

Существует одно важное исключение. Bill Karwin заявил, что "CONCAT (ПУСТОЙ УКАЗАТЕЛЬ, 'нечто') приводит к ПУСТОМУ УКАЗАТЕЛЮ", который верен для большей части RDBMSs, но НЕ для Oracle.

, Как предложил James Curran выше, Oracle выбрала, этот довольно критический момент для отступания от стандартного SQL обработкой АННУЛИРУЕТ и пустые строки точно то же. Хуже, чем просто обработка их то же, однако, это может на самом деле повредить значение Нулевого значения путем возврата чего-то другого, чем ПУСТОЙ УКАЗАТЕЛЬ при конкатенации.

А именно, в оракуле CONCAT (ПУСТОЙ УКАЗАТЕЛЬ, 'нечто') приводит к 'нечто'. Спасибо Oracle, я теперь потерял свои пустые указатели, которые не могут иметь значения для Вас, но уверенный имеет значение, когда данные передаются другому RDBMSs для последующей обработки.

0
ответ дан 28 November 2019 в 04:17
поделиться

ПУСТОЙ УКАЗАТЕЛЬ является незначением, которое должно быть понижено к средневековью от того, где он прыгнул. Я нашел, что существует нетривиальный объем программирования необходимого для обработки специальных ПУСТЫХ случаев, которые могли легко быть обработаны со значением по умолчанию.

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

Одна огромная проблема, которую я всегда имел с ПУСТЫМ УКАЗАТЕЛЕМ, - то, что "ВЫБОР * от tbl, КУДА столбец = ПУСТОЙ УКАЗАТЕЛЬ" будет всегда возвращать пустой набор результатов. ПУСТОЙ УКАЗАТЕЛЬ ничему никогда не может быть равен, включая ПУСТОЙ УКАЗАТЕЛЬ. Специальное ключевое слово "столбец является пустым", единственный способ проверить на что-то являющееся пустым. Если Вы отступите от пустого указателя, то сравнение успешно выполнится: "столбец =' '" 7 возвращенных строк.

я сделал две основных реализации DB с нуля, где в конце я сожалел, что использовал ПУСТОЙ УКАЗАТЕЛЬ. В следующий раз никакой НЕ АННУЛИРУЕТ для меня!

1
ответ дан Kieveli 28 November 2019 в 04:17
поделиться

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

1
ответ дан Mark Cidade 28 November 2019 в 04:17
поделиться

Рассмотрите, почему нет никаких данных в столбце. Это означает, что дизайн таблицы неаккуратен? Несмотря на не симпатию аннулирует, существуют случаи, когда они будут соответствующими (или, достаточно соответствующими), и система не будет обычно умирать. Просто никогда не позволяйте, аннулирует в чем-либо, что является ключом-кандидатом (основной или альтернативный ключ).

1
ответ дан Jonathan Leffler 28 November 2019 в 04:17
поделиться

Большую часть времени пустой указатель лучше. Существуют, вероятно, некоторые ситуации, где это имеет мало значения, но они - немногие. Просто помните при запросах того field = '', не то же как field is null (в MySQL, по крайней мере).

2
ответ дан Adam Bellaire 28 November 2019 в 04:17
поделиться

Насколько я могу сказать, Oracle не отличает различие.

select 1 from (select '' as col  from dual) where col is null;
1
ответ дан James Curran 28 November 2019 в 04:17
поделиться

Всегда используйте ПУСТОЙ УКАЗАТЕЛЬ. Рассмотрите различие между, "Я не знаю то, что номер телефона этого человека" (ПУСТОЙ УКАЗАТЕЛЬ), и "этот человек оставил его, пробел" (очищает).

3
ответ дан Andy Lester 28 November 2019 в 04:17
поделиться

Вот пара ссылок от сайта MySQL:

http://dev.mysql.com/doc/refman/5.0/en/problems-with-null.html

http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html

я действительно читал однажды, что NULL значение составляет 2 бита, где, поскольку пустая строка составляет только 1 бит. 99% времени, это не будет иметь никакого значения, но в очень большой таблице, когда не будет иметь значения, если NULL или '', то могло бы быть лучше использовать '', если это верно.

3
ответ дан Darryl Hein 28 November 2019 в 04:17
поделиться

Ни один. Представьте отсутствие данных как отсутствие кортежей в отношении.

Для производительности обосновывает, что Вы могли бы хотеть избежать, участвует в некотором RDBMS, но попытайтесь разработать модель так, чтобы информация, которая может отсутствовать, была в отдельном отношении.

4
ответ дан John Nilsson 28 November 2019 в 04:17
поделиться

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

ОБНОВЛЕНИЕ: Извините, я забыл добавлять что в то время как большинство (все?) RDMBSs используют это то же определение для пустого указателя, существуют детальные различия в том, как пустой указатель обрабатывается. Например, MySQL и Oracle позволяют несколько пустых указателей в столбце UNIQUE (или набор столбцов), потому что пустой указатель не является значением и не может считаться уникальным (пустой указатель! = пустой указатель). Но в прошлый раз, когда я использовал SQL Server MS, он только позволил единственный пустой указатель. Таким образом, Вы, возможно, должны были бы рассмотреть поведение RDBMS, и будет ли рассматриваемый столбец ограничен или индексирован.

4
ответ дан Eric R. Rath 28 November 2019 в 04:17
поделиться

Пустой указатель лучше, "" на самом деле представляет данные и это регистр привычки то же в Вашем коде

4
ответ дан Josh Mein 28 November 2019 в 04:17
поделиться

Пустой указатель. Пустая строка не является "никакими данными", это - данные, которые, оказывается, пусты.

25
ответ дан Paul Tomblin 28 November 2019 в 04:17
поделиться

Используйте правильный инструмент для задания. ПУСТОЙ УКАЗАТЕЛЬ может показать, что никакое значение (еще) не было обеспечено, или он может показать, что никакое значение не применимо.

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

Разрешение столбца содержать и ПУСТОЙ УКАЗАТЕЛЬ и '' дает Вам возможность различать эти случаи. В любом случае не хорошо использовать то для выражения другого.

знать, что в конкатенации строк, что-либо объединилось с ПУСТЫМ ПУСТЫМ УКАЗАТЕЛЕМ урожаев. Например: CONCAT (ПУСТОЙ УКАЗАТЕЛЬ, 'нечто') приводит к ПУСТОМУ УКАЗАТЕЛЮ. Учитесь использовать ОБЪЕДИНЕНИЕ () функция, если Вы хотите преобразовать ПУСТОЙ УКАЗАТЕЛЬ в некоторое значение по умолчанию в SQL-выражении.

3
ответ дан Bill Karwin 28 November 2019 в 04:17
поделиться
Другие вопросы по тегам:

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