Чи хороший дизайн таблиці з одним стовпчиком? [зачинено]


111

Це нормально мати таблицю з лише одним стовпцем? Я знаю, що це технічно нелегально, але чи вважається це поганим дизайном?

Редагувати:

Ось кілька прикладів:

  • У вас є таблиця з 50 дійсними кодами штатів США, але вам не потрібно зберігати багатослівні імена штатів.
  • Чорний список електронної пошти.

Хтось згадав про додавання ключового поля. Як я це бачу, цей єдиний стовпець БУДЬ первинний ключ.


У мене виникають невеликі труднощі з уявленням про регістр використання таблиці, що містить лише один стовпець. Чи можете ви навести приклад?
Пол Морі

але принаймні не створюйте для нього індекс!
Сатья

3
Американські державні коди є класичним прикладом визначення домену
Quassnoi

3
Я бачив таблицю бази даних, яка використовувалась для утримування значення блокування для програми
Russ Cam

Моє використання для цього шаблону полягало в створенні наборів даних. Кожен запис у головній таблиці містить поле SET. Записи з тим же SET підключені. Як ви вставляєте кілька записів з одним SET? 'INSERT INTO встановлює VALUES ()', а потім використовуйте ідентифікатор останньої вставки як ідентифікатор SET для додавання до записів. Потім знову, можливо, я міг би скористатися UUID, але щось не так у цьому.
Вільям Ентрікен

Відповіді:


87

Так, це, безумовно, хороший дизайн, щоб створити стіл таким чином, щоб зробити його найбільш ефективним. "Поганий дизайн RDBMS", як правило, орієнтований на неефективність.

Однак я виявив, що більшість випадків дизайну однієї колонки можуть отримати користь від додаткового стовпця. Наприклад, у кодах штатів зазвичай може бути вказано повне ім'я держави у другому стовпчику. Або у чорному списку можуть бути пов’язані нотатки. Але якщо ваш дизайн справді не потребує цієї інформації, то цілком нормально мати єдиний стовпчик.


168

З точки зору relational algebraцього було б одинакове відношення, яке означає " ця річ існує "

Так, добре мати таблицю, що визначає таке відношення: наприклад, визначити домен.

Значення такої таблиці, звичайно, повинні бути природними первинними ключами.

Таблиця пошуку - prime numbersце те, що мені спочатку спадає на думку.


3
+1: Таблиця - це набір значень, які трапляються як примітивні типи RDBMS.
S.Lott

4
+1 для надання відповіді на основі реляційної теорії.
lubos hasko

Ось хороший приклад схеми , яка має таблицю з 1 стовпець, не природний ключ, таблиця потоків в системі обміну повідомленнями ... stackoverflow.com/a/6542556/45767
JeremyWeir

29

Я використовував їх у минулому. Один мій клієнт хотів автоматично заблокувати будь-кого, хто намагався зареєструватися за номером телефону в цьому великому списку, який у нього був, тому це був лише один великий чорний список.


19

Якщо в цьому є обґрунтована потреба, то я не бачу проблеми. Можливо, ви просто хочете, щоб список можливостей відображався з якихось причин, і ви хочете мати можливість динамічно змінювати його, але не потрібно пов’язувати його з іншою таблицею.


+1 - Підсумок, це правильна відповідь у моїй книзі
Марк Бріттінгем

+1 за стислу, чітку відповідь.
Меттью Джонс

3
Чому одна таблиця стовпців не може бути пов'язана з іншою таблицею?
Ахехо

2
Чому ні? Візьмемо приклад таблиці коду стану. Чому б ви не використали це як обмеження ключових даних щодо іншої таблиці з адресними полями?
Aheho

1
Це прекрасний приклад того часу, що це було б гарною ідеєю.
Кевін

11

Один випадок, який я іноді знаходив, - це щось подібне:

Таблиця country_id , містить лише один стовпець з числовим ідентифікатором для кожної країни.

Таблиця country_description , містить стовпчик з ідентифікатором країни, стовпець з ідентифікатором мови та стовпець з локалізованою назвою країни.

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

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

У цьому випадку я думаю, що існування однієї таблиці стовпців виправдано.

Відредаговано у відповідь на коментар: Quassnoi


(джерело: ggpht.com )

У цій схемі я можу визначити іноземний ключ у таблиці company_factories, який не вимагає від мене включати стовпець Мова на стіл, але якщо у мене немає таблиці країни_id, я повинен включити стовпець Мова для таблиці, щоб визначити зовнішній ключ .


2
Навіщо мати країни_id? Щоб вставити країну, вам потрібно знати її назву принаймні однією мовою, і це призведе до того, що країна_id з’явиться в описі країн. Країна_ід без входу в опис країни_ безглуздо. "Пан Барак Обама, президент COALESCE (14243, ім'я країни) ВІДНОВЛЕНО НУЛЬНУ ЦІННУ, сьогодні зустрівся з Президентом Росії Дмитром Медведєвим"
Quassnoi

4
@Doliveras: Гаразд, зараз бачу, +1. Однак я б краще скористався ISO 3166-1 для coutry_code. На відміну від цифрового ідентифікатора, 3-літерний код країни дає уявлення про те, яку країну згадують майже всі люди в світі, які можуть читати латинський алфавіт.
Quassnoi

Ось ще один спосіб, який я застосував для розміщення перекладів на природні мови в ту саму таблицю. Зрозуміло, що багато полів є нульовими, але ви можете завантажити цілісність даних на спеціальні тригери. 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

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


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

2

Я б сказав загалом, так. Не впевнений, навіщо вам потрібен лише один стовпець. Є деякі винятки з цього, які я бачив ефективно. Це залежить від того, що ви намагаєтеся досягти.

Вони не дуже хороший дизайн, коли ви думаєте про схему бази даних, але насправді їх слід використовувати лише як таблиці утиліт.

Я бачив таблиці чисел, які ефективно використовувалися в минулому.


1

Призначення бази даних - співвідносити інформацію один з одним. Як ви можете це зробити, якщо немає даних, які стосуються?

Можливо, це якась таблиця компіляції (тобто FirstName + LastName + Birthdate), хоча я все ще не впевнений, чому ви хочете це зробити.

EDIT: Я міг бачити використання такої таблиці для простого списку. Це для чого ви використовуєте?


9
Ні, головна мета бази даних - зберігання інформації.
Спенсер Рупорт

Але електронна таблиця може зберігати інформацію. І наскільки корисна інформація, якщо це лише купа розчленованих цифр та букв, не пов'язаних між ними?
Меттью Джонс

Інформація може бути корисною, оскільки програма, що використовує базу даних, потребує її, і це не фіксований набір. Тобто БД - це просто найзручніше місце для розміщення інформації, яка використовується додатком бази даних - реляційною чи іншою. Я майже впевнений, що ви погоджуєтесь, що ми не будуємо додатки, щоб довести нашу чистоту відносно ідеального відношення. Натомість ми створюємо додатки, щоб бути корисними.
Марк Бріттінгем

@Mark - Це я мав на увазі під простим списком. Здогадайтесь, я не дуже добре пояснив себе.
Меттью Джонс

1
@SR - Ні, головна мета бази даних - отримання інформації. Оскільки рядки інтересів частіше за все залежать від інших даних, я думаю, що оригінальний коментар MJ стоїть.
CurtainDog

1

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


2
Це смішно. Операція видалення без первинного ключа або обмеження буде видаляти всі відповідні рядки, а не ігнорувати їх.
Ерік Функенбуш

1
Під «не працювати» він міг означати «не працювати так, як очікувалося», що охоплює умову «ей, я видалив один рядок, але обидва пішли».
GWLlosa

Або, якщо ви спробуєте видалити запис із SSMS із подання "Відкрита таблиця", це насправді підкине діалогове вікно, що запис не можна однозначно ідентифікувати, а потім нічого не робити ...
Майкл Фредріксон

-1

Єдиний випадок використання, який я можу скласти, - це таблиця слів, можливо, для гри в слова. Ви отримуєте доступ до таблиці просто для того, щоб переконатися, що рядок - це слово: виберіть слово зі слів, де word =?. Але є набагато кращі структури даних для вмісту списку слів, ніж реляційні база даних.

В іншому випадку, дані в базі даних зазвичай розміщуються в базі даних, щоб скористатися взаємозв'язком між різними атрибутами даних. Якщо ваші дані не мають атрибутів, що перевищують її значення, як розвиватимуться ці відносини?

Тож, хоча це не незаконно, взагалі, напевно, ви не повинні мати таблицю із лише одним стовпцем.


Подібною є таблиця цифр, яка дуже зручна для припинення циклу.
u07ch

-1

У всіх моїх таблицях є щонайменше чотири технічні поля, послідовний первинний ключ, часові позначки створення та модифікації та булева видалення програмного видалення. У будь-якому чорному списку ви також хочете знати, хто додав запис. Тож для мене відповідь - ні, таблиця з лише одним стовпцем не мала б сенсу, крім випадків, коли щось прототипували.


1
Це здається, що ви змішуєте таблицю даних з таблицею транзакцій. На мою думку, це повинні бути дві окремі речі.
Джош Ное

-2

Так, це прекрасно. але поле ідентифікатора не могло пошкодити це правильно?


7
Власне, це може. Коли у вас є остаточний список допустимих значень, останнє, що потрібно, - це поле ідентифікатора, оскільки це означає, що значення не є унікальними. Якщо "LightBlue" є ключем, то ви не хочете, щоб хтось думав, що "LightBlue" з id 1 може відрізнятися від "LightBlue" з id 4.
Джеремі Бурк

Хто каже, що ІД повинен бути ідентичним? Або частина ключа?
Ерік

3
Це може бути синтетичний ключ, і вихідне поле може мати на ньому унікальне обмеження.
Марк Канлас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.