Nano Hash - криптовалюты, майнинг, программирование

Используете пустое поле для представления чего-либо?

Можно ли использовать значение «NULL» в deal.tariff_id, чтобы обозначить его принадлежность к каким-либо тарифам в таблице tariff_data с affiliate_id=3?

Например:

mysql> select * from phone;
+----+------------------+
| id | name             |
+----+------------------+
|  4 | HTC Sensation XL |
| 26 | iPhone 4s        |
| 25 | iPhone 5         |
| 24 | Nokia C3-01      |
+----+------------------+

mysql> select * from tariff;
+----+-----------------+-----------------+--------------+-------------+
| id | name            | tariff_duration | monthly_cost | description |
+----+-----------------+-----------------+--------------+-------------+
|  1 | Business Plan 1 |              24 |         5.00 |             |
|  2 | Business Plan 2 |              24 |        10.00 |             |
|  4 | Business Plan 3 |              24 |        15.52 |             |
|  5 | Business Plan 4 |              24 |        18.52 |             |
|  8 | Super Plan      |              12 |        15.00 |             |
+----+-----------------+-----------------+--------------+-------------+

mysql> select * from tariff_data;
+----+-----------+--------------+-------+
| id | tariff_id | affiliate_id | bonus |
+----+-----------+--------------+-------+
|  1 |         1 |            3 | 34.00 |
|  2 |         2 |            3 | 44.00 |
|  5 |         3 |            3 | 10.00 |
|  6 |         4 |            3 | 10.00 |
|  7 |         5 |            3 | 10.00 |
+----+-----------+--------------+-------+

В таблице deal вы можете увидеть, что affiliate_id=3 и tariff_id=NULL относятся к любому тарифу, который указан в таблице tariff_data. Я сделал это, чтобы уменьшить количество строк в deal. Если я не включаю NULL, это означает, что я должен включать много tariff_id с одинаковыми phone_id и наоборот.

mysql> select * from deal;
+----+----------+-----------+--------------+--------+
| id | phone_id | tariff_id | affiliate_id | active |
+----+----------+-----------+--------------+--------+
|  1 |        4 |      NULL |            3 |      1 |
|  3 |       24 |      NULL |            3 |      1 |
|  9 |       24 |         8 |            4 |      1 |
| 10 |       25 |         8 |            4 |      1 |
| 11 |       26 |         8 |            4 |      1 |
+----+----------+-----------+--------------+--------+

Обновление, пример, если я не использовал значение NULL:

mysql> select * from deal;
+----+----------+-----------+--------------+--------+
| id | phone_id | tariff_id | affiliate_id | active |
+----+----------+-----------+--------------+--------+
|  1 |        4 |         1 |            3 |      1 |
|  2 |        4 |         2 |            3 |      1 |
|  3 |       24 |         1 |            3 |      1 |
|  4 |       24 |         2 |            3 |      1 |
|  5 |       24 |         3 |            3 |      1 |
|  6 |       24 |         4 |            3 |      1 |
|  7 |       24 |         5 |            3 |      1 |
|  9 |       24 |         8 |            4 |      1 |
| 10 |       25 |         8 |            4 |      1 |
| 11 |       26 |         8 |            4 |      1 |
+----+----------+-----------+--------------+--------+

Ответы:


1

Как и два других ответа, это не очень хорошая идея. Вот предложение по нормализации.

Вы хотите, чтобы некоторые сделки представляли собой «общую» сделку, независимо от тарифа. Вы можете разделить таблицу сделок на две части: одну для простых сделок, а другую - для общих:

mysql> select * from deal_simple;
+----+----------+-----------+--------------+--------+
| id | phone_id | tariff_id | affiliate_id | active |
+----+----------+-----------+--------------+--------+
|    |       24 |         8 |            4 |      1 |
|    |       25 |         8 |            4 |      1 |
|    |       26 |         8 |            4 |      1 |
+----+----------+-----------+--------------+--------+

mysql> select * from deal_general_tariff;
+----+----------+--------------+--------+
| id | phone_id | affiliate_id | active |
+----+----------+--------------+--------+
|    |        4 |            3 |      1 |
|    |       24 |            3 |      1 |
+----+----------+--------------+--------+

Затем вы можете получить расширенные результаты с помощью простого запроса (я предполагаю, что вы не включили по ошибке еще 3 строки, которые связаны phone_id 4 с tariff_id 3, 4, 5):

SELECT phone_id, tariff_id, affiliate_id, active
FROM deal_simple

UNION

SELECT dgt.phone_id, td.tariff_id, dgt.affiliate_id, dgt.active
FROM 
    deal_general_tariff AS dgt
  JOIN 
    tariff_data AS td
      ON td.affiliate_id = dgt.affiliate_id ;
06.10.2012
  • Это фантастическая идея, спасибо вам большое! Просто быстрый вопрос. Некоторые тарифы относятся к Sim Only Deal (в таблице tariff), что означает, что они не идут в комплекте с телефоном. Вы бы поместили это в deal_simple или deal_general_tariff с phone_id = NULL? 07.10.2012
  • Вы имеете в виду предложения, не зависящие от телефонов? Тогда у вас может быть deal_general_phone, в котором все столбцы будут как deal, кроме phone_id (та же идея, что и выше) 07.10.2012
  • Нет. Например, клиент хочет заказать контракт (тариф) только на сим-карту, но у него уже есть телефон. Он хочет заказать контракт (тариф) только на сим-карту без телефона. В этом смысле. может быть, как deal_without_phone или deal_simonly 07.10.2012

  • 2

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

    Как отметил Одед, NULL означает отсутствующее неизвестное значение.

    • Может быть столбец для указания собственности
    • Нормализация
    • Использовать существующий столбец "rate_id" в качестве индикатора владения со значением NON NULL.
    06.10.2012
  • Покажите пример столбца, чтобы указать право собственности, которое вы имели в виду, и способ нормализации 07.10.2012
  • Кажется, вы используете столбец tarrif_id, поскольку этого индикатора нет? Что в настоящее время представляют ненулевые значения? Что касается нормализации, я не настоятельно рекомендую это - я просто перечислял общие решения. Ваши таблицы уже выглядят нормализованными. 07.10.2012
  • Если я использую столбец tarrif_id как NULL, это означает, что phone_id принадлежит какой-либо tariff_data таблице (deal.affiliate_id = tariff_data.affiliate_id). Значения None NULL в настоящее время представляют собой связанные записи между deal.tariff_id = tariff.id 07.10.2012
  • Достаточно справедливо - это может стать философским, но то, что я сделал бы (лично), - это использовать значение NON NULL int для представления «любого» владения. MySQL определяет NULL как отсутствующее неизвестное значение. . Это использование фактически является известной ценностью «любого» владения. Точно так же вы могли бы использовать null для представления «любого», это просто кажется ограничивающим и, возможно, сбивающим с толку. 07.10.2012
  • Я понимаю что ты имеешь в виду. Я мог бы определить все tariff_id для каждого phone_id в таблице deal, но он становится действительно большим, если вы понимаете, о чем я? Я обновил свой вопрос, чтобы вы могли видеть пример того, что я имел в виду. 07.10.2012
  • Я бы не пошел по этому пути. Взгляните на этот поток вроде бы похожий вопрос. 07.10.2012

  • 3

    Не хорошая идея.

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

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

    Во-вторых, он не расширяемый - что, если вам нужно что-то для представления всех тарифов с affiliate_id из 4?

    В-третьих, что делать, если вам действительно нужно использовать NULL?

    06.10.2012

    4

    Не хорошая идея. Основная проблема в том, что NULL уже означает три разных вещи, и это делает их проблематичными. Вы задаете проблемы. Он представляет собой:

    1. Неизвестное значение (т.е. не введено, предполагается, что существует). Это означает, что NULL || «mytext» ЕСТЬ ПУЛЬ.
    2. Известно, что значение не существует (например, используется NULL во второй строке почтового адреса). Это проблематично, но избежать этого очень сложно. На платформах, отличных от Oracle, для символьных типов лучше использовать пустые строки. Похоже, вы это взвешиваете.
    3. Значение не найдено в результатах внешнего соединения

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

    Проблема, конечно, возникает, когда ожидается, что одно из двух значений присутствует, например employee.hourly_wage или employee.monthy_salary. Это, конечно, плохой пример, поскольку можно использовать wage_or_salary плюс pay_unit, но проблема довольно универсальна. Очень часто приходится выбирать между идеальной нормализацией и избеганием нулей в столбцах, с одной стороны, и богатых ограничений данных между столбцами, с другой.

    07.10.2012

    5

    Не используйте NULL для передачи сообщения. Используйте NULL, чтобы указать на отсутствие значения.

    Отсутствие значения может означать, что значение существует, но неизвестно. Это дело освещал Одед.

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

    Вы можете обойти этот последний случай, если вам нужно, с помощью метода, который имеет тег с именем «Наследование таблицы классов» в SO.

    Если читатели данных сделают выводы из отсутствия значения, они смогут это сделать. Но вывод - это не общение.

    07.10.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..