Как использовать кросс-таблицу для нескольких столбцов?

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

  • Невозможно гарантировать, что каждое значение является правильным типом данных: невозможно предотвратить 1,2,3, banana, 5
  • Невозможно использовать ограничения внешнего ключа привязать значения к таблице поиска; нет возможности обеспечить ссылочную целостность.
  • Невозможно обеспечить уникальность: невозможно предотвратить 1,2,3,3,3,5
  • Can 't удалить значение из списка, не извлекая весь список.
  • Не удается сохранить список дольше, чем в столбце строки.
  • Трудно найти все объекты с заданное значение в списке; вы должны использовать неэффективное сканирование таблицы. Возможно, придется прибегать к регулярным выражениям, например, в MySQL: idlist REGEXP '[[:<:]]2[[:>:]]' *
  • Жестко подсчитывать элементы в списке или выполнять другие агрегированные запросы.
  • Трудно присоединиться к значениям к справочной таблице, к которой они ссылаются.
  • Жесткий выбор списка в отсортированном порядке.
  • Сохранение целых чисел в виде строк занимает в два раза больше места, чем сохранение двоичных целых чисел. Не говоря уже о пространстве, взятом запятыми.

Чтобы решить эти проблемы, вам нужно написать тонны кода приложения, заново изобрести функциональные возможности, которые СУБД уже обеспечивает гораздо более эффективно .

Списки, разделенные запятыми, настолько ошибочны, что я сделал это первой главой в моей книге: SQL Antipatterns: избегайте ошибок программирования баз данных .

Бывают случаи, когда вам нужно использовать денормализацию, но, поскольку @OMG Ponies упоминает , это исключения. Любая нереляционная «оптимизация» выгодна для одного типа запросов за счет других видов использования данных, поэтому убедитесь, что знаете, какие из ваших запросов нужно обрабатывать так специально, что они заслуживают денормализации.


* MySQL 8.0 больше не поддерживает этот синтаксис выражения слова-границы.

1
задан user10939484 24 March 2019 в 18:36
поделиться

1 ответ

Вы не ищете кросс-таблицу, просто проверьте количество ненулевых значений, используя notnull:

df[df.notnull().sum(1).gt(1)]

     a    b    c
0    a  NaN    c
1    a    b  NaN
2  NaN    b    c
<час>

Или вы можете использовать [ 115]:

t = 2
df.dropna(thresh=df.shape[1] - t + 1)

     a    b    c
0    a  NaN    c
1    a    b  NaN
2  NaN    b    c
0
ответ дан user3483203 24 March 2019 в 18:36
поделиться
Другие вопросы по тегам:

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