Является ли таблица с одним столбцом хорошим дизайном? [закрыто]

111

Можно ли иметь таблицу только с одним столбцом? Я знаю, что технически это не незаконно, но считается ли это плохим дизайном?

РЕДАКТИРОВАТЬ:

Вот несколько примеров:

  • У вас есть таблица с 50 действующими кодами штатов США, но вам не нужно хранить подробные названия штатов.
  • Черный список адресов электронной почты.

Кто-то упомянул добавление ключевого поля. На мой взгляд, этот единственный столбец БУДЕТ первичным ключом.

Ахехо
источник
У меня возникли проблемы с представлением варианта использования таблицы только с одним столбцом. Вы можете привести пример?
Пол Мори
но по крайней мере не создавайте для него индекс!
Сатья
3
Коды штатов США - классический пример определения домена
Quassnoi
3
Я видел таблицу базы данных, которая раньше использовалась для хранения значения блокировки для приложения
Расс Кам
Я использовал этот шаблон для создания наборов данных. Каждая запись в основной таблице имеет поле SET. Подключаются записи с таким же SET. Как вставить несколько записей с одним и тем же набором? 'INSERT INTO устанавливает VALUES ()', а затем используйте последний идентификатор вставки в качестве идентификатора SET для прикрепления к записям. Опять же, возможно, я мог бы использовать UUID, но что-то здесь не так.
Уильям Энтрикен,

Ответы:

87

Да, это, безусловно, хороший дизайн - спроектировать стол таким образом, чтобы он был наиболее эффективным. «Плохой дизайн СУБД» обычно связан с неэффективностью.

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

Эрик Функенбуш
источник
168

С точки зрения relational algebraэтого было бы унарное отношение, означающее " эта вещь существует ".

Да, нормально иметь таблицу, определяющую такое отношение: например, для определения домена.

Значения такой таблицы, конечно, должны быть естественными первичными ключами.

В prime numbersпервую очередь мне приходит в голову справочная таблица .

Quassnoi
источник
3
+1: таблица представляет собой набор значений, которые являются примитивными типами вашей СУБД.
S.Lott
4
+1 за ответ, основанный на теории отношений.
lubos hasko 02
Вот хороший пример схемы с таблицей из 1 столбца, которая не является естественным ключом, таблица потоков в системе обмена сообщениями ... stackoverflow.com/a/6542556/45767
JeremyWeir
29

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

Спенсер Рупорт
источник
19

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

Кевин
источник
+1 - Итог, это правильный ответ в моей книге
Марк Бриттингем
+1 за лаконичный и ясный ответ.
Мэтью Джонс,
3
Почему нельзя связать таблицу из одного столбца с другой таблицей?
Aheho, 04
2
Почему нет? В качестве примера возьмем таблицу кодов штатов. Почему бы вам не использовать это как ограничение внешнего ключа для другой таблицы с полями адреса?
Ахехо, 05
1
Это отличный пример того времени, когда это было бы хорошей идеей.
Кевин
11

Один случай, который я иногда обнаруживал, выглядит примерно так:

Таблица Country_id содержит только один столбец с числовым идентификатором для каждой страны.

Таблица Country_description содержит столбец с идентификатором страны, столбец с идентификатором языка и столбец с локализованным названием страны.

Таблица company_factories , содержит информацию по каждой фабрике компании, включая страну, в которой находится.

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

В этом случае я считаю оправданным существование одностолбцовых таблиц.

Отредактировано в ответ на комментарий: Quassnoi


(источник: ggpht.com )

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

Доливерас
источник
2
Зачем нужен country_id? Чтобы вставить страну, вам нужно знать ее название хотя бы на одном языке, и это приведет к тому, что country_id появится в Country_description. Country_id без записи country_description не имеет смысла. «Г-н Барак Обама, президент COALESCE (14243, country_name), ВОЗВРАЩЕННОЕ НУЛЕВОЕ ЗНАЧЕНИЕ, сегодня встретился с Дмитрием Медведевым, президентом России»
Quassnoi
4
@Doliveras: Хорошо, теперь я понимаю, +1. Однако я бы предпочел использовать ISO 3166-1 для coutry_code. В отличие от числового идентификатора, трехбуквенный код страны дает представление о том, какая страна упоминается почти всем в мире, кто может читать латинский алфавит.
Quassnoi
Вот еще один способ, который я реализовал, чтобы разместить переводы естественного языка в одной таблице. Конечно, в результате многие поля могут иметь значение NULL, но вы можете передать целостность данных пользовательским триггерам. CREATE TABLE "DBA" "myLocalisedTable" ( "entry_id" INTEGER NOT NULL DEFAULT AUTOINCREMENT, "master_entry_id" INTEGER NULL, "master_entry_label" VARCHAR (200) NULL, "LANGUAGE_ID" INTEGER NULL, "localised_entry_label" VARCHAR (300) NULL,.
Винсент Бак
7

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

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

Джереми Бурк
источник
5

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

Я могу представить себе два варианта использования одностолбцовых таблиц OTMH:

1) Элемент данных существует. Часто используется в раскрывающихся списках. Также используется для простых тестов на легитимность.

Например. двухбуквенные аббревиатуры штатов США; Почтовые индексы, на которые мы отправляем; слова законные в Scrabble; и т.п.

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

Например. сотрудники, у которых неизлечимая болезнь; банки с 360-дневным годом (большинство используют 365); и т.п.

-Ал.

А.И. Бревелери
источник
4

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

Агнель Куриан
источник
4

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

HLGEM
источник
Хотя использование одного столбца здесь, вероятно, нормально, имейте в виду, что вы можете установить ограничения уникальности и для других столбцов.
Stealth Rabbi
2

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

Когда вы думаете о схеме базы данных, они не очень удачный дизайн, но на самом деле их следует использовать только как служебные таблицы.

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

Брендан Энрик
источник
1

Цель базы данных - связать фрагменты информации друг с другом. Как вы можете это сделать, когда нет данных, к которым можно было бы относиться?

Возможно, это какая-то таблица компиляции (например, FirstName + LastName + Birthdate), хотя я все еще не уверен, зачем вам это нужно.

РЕДАКТИРОВАТЬ: я мог видеть использование такой таблицы для простого списка. Это то, для чего вы его используете?

Мэтью Джонс
источник
9
Нет, основная цель базы данных - хранить информацию.
Спенсер Рупорт, 04
Но в электронной таблице можно хранить информацию. И чем полезна информация, если это просто набор разрозненных цифр и букв, между которыми нет корреляции?
Мэтью Джонс,
Информация может быть полезной, потому что она нужна приложению, использующему базу данных, и это не фиксированный набор. То есть БД - это просто самое удобное место для размещения информации, которая будет использоваться приложением базы данных - реляционным или другим. Я почти уверен, что вы согласитесь с тем, что мы не создаем приложения, чтобы доказать свою чистоту в отношении идеала отношений. Вместо этого мы создаем приложения, чтобы они были полезными.
Марк Бриттингем
@Mark - это то, что я имел в виду под простым списком. Думаю, я не очень хорошо объяснил.
Мэтью Джонс,
1
@SR - Нет, основная цель базы данных - извлекать информацию. Поскольку интересующие нас строки чаще всего зависят от других частей данных, я думаю, что оригинальный комментарий MJ остается в силе.
CurtainDog 05
1

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

Эрик
источник
2
Это вздор. Операция удаления без первичного ключа или ограничения будет удалять все совпадающие строки, а не игнорировать их.
Erik Funkenbusch
1
Под «не работает» он мог иметь в виду «не работает, как ожидалось», что охватывает условие «эй, я удалил одну строку, но обе пропали».
GWLlosa 04
Или, если вы попытаетесь удалить запись в SSMS из представления «Открытая таблица», на самом деле появится диалоговое окно о том, что запись не может быть однозначно идентифицирована, а затем ничего не произойдет ...
Майкл Фредриксон
-1

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

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

Таким образом, хотя это и не является незаконным, в целом вам, вероятно, не следует иметь таблицу с одним столбцом.

jmucchiello
источник
Похожая на это таблица чисел очень удобна для остановки цикла.
u07ch 04
-1

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


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

Да, это прекрасно. но поле идентификатора не могло повредить?

Эрик
источник
7
Собственно, может. Когда у вас есть окончательный список допустимых значений, последнее, что вам нужно, - это поле идентификатора, поскольку оно подразумевает, что значения не уникальны. Если «LightBlue» является ключевым, тогда вам не нужно, чтобы кто-то думал, что «LightBlue» с идентификатором 1 может отличаться от «LightBlue» с идентификатором 4.
Джереми Бурк
Кто сказал, что идентификатор должен быть личностью? Или часть ключа?
Эрик
3
Это может быть синтетический ключ, и исходное поле может иметь уникальное ограничение.
Марк Канлас