Что такое ограничения базы данных? [закрыто]

93

Каково четкое определение ограничения базы данных? Почему ограничения важны для базы данных? Какие бывают типы ограничений?

bala3569
источник
12
На этот вопрос есть четкий ответ. Это не «слишком широко». Его большое количество голосов за и избранное показывает, насколько он был полезен для многих людей. Я подчистил формулировку и выдвинул ее на повторное открытие.
La-comadreja
@BasilBourque, этот вопрос очень плохо подходит для программистов - он был бы быстро отклонен и закрыт там, см. Meta.programmers.stackexchange.com/questions/6483/… Рекомендуемая литература: Что происходит на Programmers.SE? Руководство по Stack Overflow
gnat
1
@gnat Хотя эта страница оставляет у меня нечеткое представление о том, что является или не является актуальным для Programmers Stack Exchange, я могу понять и согласиться с минимальным порогом для автора сообщения, который сначала прочитал непосредственно относящуюся к делу статью в Википедии, которая предоставляет такой же сжатый или сводный обзор, который запрашивается на Stack Exchange.
Basil Bourque
2
Название слишком широкое, а дополнительные вопросы задают сразу несколько вопросов -_- Как TomTom, P ரதீப், greg-449, bummi и Nit хотят этого? Пожалуйста, объясни. Можно ли вообще спросить об ограничениях ...?
Lealo
Хотя я понимаю, что отношение к вопросам слишком велико и основано на мнениях, я не согласен с требованием первого чтения статьи в Википедии. Он НЕ предоставляет «такой же сжатый или сводный обзор». Принятый ответ дает гораздо более сжатый и точный ответ, чем ссылка на википедию выше.
Forever

Ответы:

118

Ограничения являются частью определения схемы базы данных.

Ограничение обычно связано с таблицей и создается с помощью оператора CREATE CONSTRAINTили CREATE ASSERTIONSQL.

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

Общие виды ограничений:

  • not null - каждое значение в столбце не должно быть NULL
  • уникальный - значение (я) в указанном столбце (ах) должно быть уникальным для каждой строки в таблице
  • первичный ключ - значение (я) в указанном столбце (ах) должно быть уникальным для каждой строки в таблице и не быть NULL ; обычно каждая таблица в базе данных должна иметь первичный ключ - он используется для идентификации отдельных записей
  • внешний ключ - значение (я) в указанном столбце (ах) должно ссылаться на существующую запись в другой таблице (через ее первичный ключ или какое-либо другое уникальное ограничение )
  • check - указано выражение, которое должно быть истинным, чтобы ограничение было удовлетворено
Зига Краньец
источник
3
+1 за включение PK, не
ноль, ноль
+1, но вы все равно можете подробнее рассказать о сценариях FOREIGN KEY и предоставить несколько ссылок.
Unreason
2
Проверочные ограничения не должны оцениваться как ложные. Они не обязательно должны быть правдой. Неизвестный тоже хорошо.
Мартин Смит
2
Разве ограничение типа не было бы обычным явлением?
Martin
1
Хотя мы обычно не называем их ограничениями, я бы сказал, что тип данных - это форма ограничения. Если я определяю что-то как Int или datetime, это ограничивает тип данных, которые могут быть помещены в поле. Правильный выбор типов данных является важной частью обеспечения целостности данных.
HLGEM
36

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

Целостность данных означает достоверность данных. Ваши данные действительны? Представляют ли ваши данные то, для чего вы их создали?

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

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

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

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

Один мудрец однажды сказал: «Данные должны защищать себя!» . И это то, что делают ограничения. Это правила, которые сохраняют данные в вашей базе данных как можно более достоверными.

Есть много способов сделать это, но в основном они сводятся к следующему:

  • Ограничения внешнего ключа, вероятно, являются наиболее часто используемым ограничением и гарантируют, что ссылки на другие таблицы разрешены только в том случае, если действительно существует целевая строка для ссылки. Это также делает невозможным разрушение такой связи путем удаления указанной строки, создавая мертвую ссылку.
  • Проверочные ограничения могут гарантировать, что в определенном столбце разрешены только определенные значения. Вы можете создать ограничение, разрешающее только слово «желтый» или «синий» в столбце VARCHAR. Все остальные значения приведут к ошибке. Получите идеи по использованию проверочных ограничений. Проверьте sys.check_constraintsпредставление в образце базы данных AdventureWorks.
  • Правила в SQL Server можно использовать повторно. Проверка ограничений (позволяет поддерживать синтаксис из одного места и упрощает развертывание ограничений в других базах данных)

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

Ограничения FOREIGN KEY - Microsoft

Ограничение внешнего ключа - w3schools

ПРОВЕРИТЬ ограничения

Удачи! ;)

Alex
источник
Как некро-комментарий, кажется, что правила теперь испражняются Microsoft.
Гэри
6

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

  1. Первичный ключ : однозначно идентифицирует данные. Если это ограничение было указано для определенного столбца, мы не можем вводить повторяющиеся данные в этот столбец.
  2. Проверить : например NOT NULL. Здесь мы можем указать, какие данные мы можем ввести для этого конкретного столбца, а какие не ожидается для этого столбца.
  3. Внешний ключ : ссылки внешнего ключа на строку другой таблицы. Таким образом, данные, указанные в одной таблице из другой таблицы, всегда доступны для ссылающейся таблицы.
user3107247
источник
3

Ограничения могут использоваться для обеспечения соблюдения определенных свойств данных. Простой пример - ограничить столбец int значениями [0-100000]. Этот введение выглядит неплохо.

Андерс Абель
источник
3

Ограничения определяют, какие значения допустимы для данных в базе данных. Например, вы можете обеспечить, чтобы значение a не было нулевым ( NOT NULLограничение), или что оно существует как уникальное ограничение в другой таблице ( FOREIGN KEYограничение), или что оно уникально в этой таблице ( UNIQUEограничение или, возможно, PRIMARY KEYограничение в зависимости от ваших требований. ). Более общие ограничения могут быть реализованы с помощьюCHECK ограничений.

Документация MSDN об ограничениях SQL Server 2008, вероятно, является лучшим отправным местом.

Джон Скит
источник
2
  1. UNIQUEограничение (из которых PRIMARY KEYограничение является вариантом). Проверяет уникальность всех значений данного поля в таблице. Это Xограничение оси (записи)

  2. CHECKограничение (из которых NOT NULLограничение является вариантом). Проверяет выполнение определенного условия для выражения над полями той же записи. Это Yограничение оси (поля)

  3. FOREIGN KEYограничение. Проверяет, находится ли значение поля среди значений поля в другой таблице. Это Zограничение оси (таблицы).

Quassnoi
источник
Уникальные ограничения и ограничения внешнего ключа могут быть написаны с использованием CHECKограничений, так зачем классифицировать их по-другому? то есть " Yось" (что бы это ни значило).
однажды,
2
@onedaywhen: как реализовать FOREIGN KEYиспользование CHECKограничения?
Quassnoi
1
@onedaywhen: попробуйте создать таблицу с этим ограничением.
Quassnoi
1
@onedaywhen: так сложно попробовать? Подсказка: это не сработает.
Quassnoi
3
@onedaywhen: написанный вами запрос не создает проверочного ограничения. Это простой SELECTзапрос. Вы не можете использовать подзапросы (или любые другие конструкции, которые относятся к значениям вне текущей записи) в CHECKограничениях в SQL Server.
Quassnoi
2

База данных - это компьютеризированное логическое представление концептуальной (или бизнес-модели), состоящее из набора неформальных бизнес-правил. Эти правила представляют собой понятное пользователю значение данных. Поскольку компьютеры понимают только формальные представления, бизнес-правила не могут быть представлены непосредственно в базе данных. Они должны быть отображены в формальное представление, логическую модель, которая состоит из набора ограничений целостности. Эти ограничения - схема базы данных - являются логическим представлением в базе данных бизнес-правил и, следовательно, являются смыслом данных, понятным СУБД. Отсюда следует, что если СУБД не знает и / или не применяет полный набор ограничений, представляющих бизнес-правила, у нее есть неполное понимание того, что означают данные, и, следовательно,

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

"Старый класс ошибок" Фабиана Паскаля

один день, когда
источник
2

В SQL есть четыре основных типа ограничений:

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

  • Ключевое ограничение: если значение ключевого атрибута в новом кортеже уже существует в другом кортеже в отношении

  • Ссылочная целостность: если значение внешнего ключа в новом кортеже ссылается на значение первичного ключа, которого нет в указанном отношении

  • Целостность сущности: если значение первичного ключа в новом кортеже равно null

Рагу
источник
-1

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

Прашант Кумбхаркар
источник