Що таке обмеження бази даних? [зачинено]


92

Що таке чітке визначення обмеження бази даних? Чому обмеження важливі для бази даних? Які існують типи обмежень?


12
Це питання має чітку відповідь. Він не "занадто широкий". Його велика кількість голосів і вибраних свідчить про те, наскільки це було корисно багатьом людям. Я очистив формулювання та запропонував його для повторного відкриття.
La-comadreja

@BasilBourque це питання дуже погано підходить для програмістів - його швидко проголосували б і закрили там, див. Meta.programmers.stackexchange.com/questions/6483/… Рекомендована література : Що відбувається на Programmers.SE? Посібник із переповнення стека
gnat

1
@gnat Незважаючи на те, що ця сторінка все ще розмито говорить про те, що є чи ні в темі для Programmer Stack Exchange, я можу зрозуміти і погодитися з мінімальним порогом автора публікації, який вперше прочитав безпосередньо відповідну статтю Вікіпедії, яка містить такий самий зведений або зведений огляд, який запитується на біржі стеків.
Василь Бурк

2
Заголовок широкий, а підзапитання задають декілька запитань одночасно -_- Як це хочуть TomTom, P ரதீப், greg-449, bummi та Nit? Будь ласка, поясніть. Чи можна взагалі запитати про обмеження ...?
Леало

Незважаючи на те, що я розумію, що настрої до запитань занадто загальні та засновані на думках, я не згоден з вимогою першого прочитання статті Вікіпедії. Він НЕ надає "такого ж скороченого або короткого огляду". Прийнята відповідь дає набагато більш стисну та точну відповідь, ніж посилання на Вікіпедію вище.
Кріс

Відповіді:


117

Обмеження є частиною визначення схеми бази даних.

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

Вони визначають певні властивості, яким повинні відповідати дані в базі даних. Вони можуть застосовуватися до стовпця, цілої таблиці, декількох таблиць або цілої схеми. Надійна система баз даних забезпечує збереження обмежень у будь-який час (за винятком можливо всередині транзакції, для так званих відкладених обмежень).

Поширеними видами обмежень є:

  • не null - кожне значення у стовпці не повинно мати значення NULL
  • унікальний - значення (и) у зазначених стовпцях (колонках) повинні бути унікальними для кожного рядка таблиці
  • первинний ключ - значення (и) у зазначених стовпцях (колонках) повинні бути унікальними для кожного рядка таблиці та не бути NULL ; зазвичай кожна таблиця в базі даних повинна мати первинний ключ - він використовується для ідентифікації окремих записів
  • зовнішній ключ - значення (и) у зазначених стовпцях (колонках) повинні посилатися на існуючий запис в іншій таблиці (через його первинний ключ або інший унікальне обмеження )
  • check - вказано вираз, який повинен мати значення true, щоб обмеження було задоволено

3
+1 за включення PK, не null, null
gbn

+1, все-таки ви можете розширити сценарії ІНОЗЕМНИХ КЛЮЧІВ та надати деякі посилання.
Unreason

2
Перевірка Обмеження не повинна мати значення false. Вони не повинні бути правдою. Невідоме - це теж добре.
Martin Smith

2
Чи не обмеження типу також не буде загальним видом?
Мартін

1
Хоча ми зазвичай не називаємо їх обмеженнями, я б стверджував, що тип даних є формою обмеження. Якщо я визначаю щось як Int або datetime, це обмежує тип даних, які можна помістити в поле. Правильний підбір типів даних є найважливішою частиною забезпечення цілісності даних.
HLGEM,

36

Щоб зрозуміти, навіщо нам потрібні обмеження, спочатку потрібно зрозуміти цілісність цілісності даних.

Цілісність даних стосується дійсності даних. Чи дійсні ваші дані? Ваші дані представляють те, для чого ви їх розробили?

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

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

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

Ви повинні визнати, що проектування дизайну бази даних - це лише народження вашого рішення. Ось після цього він повинен жити (сподіваємось) довго і переносити всілякі (дивні) поведінки своїх кінцевих користувачів (тобто клієнтських додатків). Але цей етап проектування є вирішальним для тривалого успіху вашого рішення! Поважайте це і приділяйте йому час та увагу, які йому потрібні.

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

Існує багато способів зробити це, але в основному вони зводяться до:

  • Обмеження зовнішнього ключа є, мабуть, найбільш часто використовуваним обмеженням і гарантує, що посилання на інші таблиці дозволяються лише тоді, коли насправді існує цільовий рядок для посилання. Це також унеможливлює розрив таких відносин шляхом видалення посиланого рядка, створюючи мертве посилання.
  • Обмеження перевірки можуть гарантувати, що в певному стовпці допускаються лише певні значення. Ви можете створити обмеження, дозволяючи лише слово "жовтий" або "синій" у стовпці VARCHAR. Усі інші значення дадуть помилку. Отримайте ідеї щодо використання обмежень перевірки, перевірте sys.check_constraintsподання у зразковій базі даних AdventureWorks
  • Правила в SQL Server - це просто багаторазово перевірені обмеження (дозволяє підтримувати синтаксис з одного місця та полегшити розгортання обмежень в інших базах даних)

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

ОБМЕЖЕННЯ ІНОЗЕМНИХ КЛЮЧІВ - Microsoft

Обмеження зовнішнього ключа - w3schools

ПЕРЕВІРТЕ Обмеження

Удачі! ;)


Як некро-коментар, здається, що Microsoft зараз дефектує правила.
Гері

6

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

  1. Первинний ключ : який однозначно ідентифікує дані. Якщо це обмеження було вказано для певного стовпця, тоді ми не можемо вводити дублікати даних у цей стовпець
  2. Перевірка : Такі як NOT NULL. Тут ми можемо вказати, які дані ми можемо ввести для цього конкретного стовпця, а що не очікується для цього стовпця.
  3. Зовнішній ключ : посилання на зовнішній ключ на рядок іншої таблиці. Таким чином, дані, згадані в одній таблиці з іншої таблиці, завжди доступні для таблиці посилань.

3

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


3

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


Унікальні обмеження та обмеження зовнішнього ключа можна записати, використовуючи CHECKобмеження, то чому класифікувати це як інакше? тобто " Y-ось" (що б це не означало).
onedaywhen

2
@onedaywhen: як ви реалізуєте FOREIGN KEYвикористання CHECKобмеження?
Quassnoi

1
@onedaywhen: спробуйте створити таблицю з цим обмеженням.
Quassnoi

1
@onedaywhen: чи так важко спробувати? Підказка: це не спрацює.
Quassnoi

3
@onedaywhen: запит, який ви написали, не створює обмеження перевірки. Це просто SELECTзапит. Ви не можете використовувати підзапити (або будь-які інші конструкції, що посилаються на значення поза поточним записом) в CHECKобмеженнях в SQL Server.
Quassnoi

2

База даних - це комп’ютеризоване логічне представлення концептуальної (або ділової) моделі, що складається з набору неформальних бізнес-правил. Ці правила є зрозумілим користувачем значення даних. Оскільки комп’ютери розуміють лише офіційні подання, ділові правила не можуть бути представлені безпосередньо в базі даних. Вони повинні бути зіставлені з офіційним поданням, логічною моделлю, яка складається з набору обмежень цілісності. Ці обмеження - схема бази даних - є логічним поданням у базі даних бізнес-правил і, отже, є розумінням СУБД значення даних. З цього випливає, що якщо СУБД не знає та / або не застосовує повний набір обмежень, що представляють ділові правила, вона має неповне розуміння того, що означають дані, і, отже,

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

"Старий клас помилок" Фабіана Паскаля


2

В основному в SQL існує 4 типи основних обмежень:

  • Обмеження домену: якщо одне зі значень атрибутів, надане для нового кортежу, не є вказаним доменом атрибута

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

  • Посилальна цілісність: якщо значення зовнішнього ключа в новому кортежі посилається на значення первинного ключа, яке не існує у відношенні, на яке посилається

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


-1

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

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