Чи повинен мій мультисерверний RDBMS або моя програма обробляти Референтну цілісність бази даних?


16

Чи повинні обробляти такі елементи, як іноземні ключі, обмеження, значення за замовчуванням тощо система управління базами даних (в даному випадку MS SQL 2005) або програма? Я почув думку обох сторін і, чесно кажучи, не впевнений, яким шляхом йти.

Є ймовірність, що ми будемо охоплювати декілька серверів / баз даних, і я не думаю, що іноземні ключі можна використовувати на пов'язаних серверах. На додаток до цього, у дизайні бази даних є кругові посилання, які не дозволяють мені використовувати ON UPDATE CASCADEвсе.

База даних - це MS SQL 2005 (можливо, 2008), і всі взаємодії з нею повинні проходити через додаток.


3
У мене є чому навчитися тут, оскільки я не можу уявити, щоб не використовувати RDBMS.
bigtang

Відповіді:


10

Якщо є якийсь шанс, що БД буде змінено за межами вашої програми, вам потрібно обмеження в базі даних. Якщо БД є і завжди буде нічим іншим, як зворотним кінцем програми, ви можете їх залишити, хоча я б документував їх на всякий випадок і, мабуть, просто затримав їх, якщо показник не був би поганим. (Програмне забезпечення Peoplesoft працює таким чином - обмеження є в програмному забезпеченні, і (я це не придумую) воно працює все як SYS на Oracle.)

Ви хочете, щоб такі речі контролювалися додатком, щоб він міг реагувати розумно і не в кращому випадку папугу повертати користувачу повідомлення про помилку бази даних.

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


5

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


1

Якщо це важливо, дозвольте базі даних обробити це. Таким чином, вам не потрібно турбуватися про те, щоб хтось звертався до бази даних за межами вашої програми та змінював або вводив деякі непослідовні або дублюючі дані. Якщо це не якісь додаткові додатки на високому рівні (наприклад, "тільки користувачів у відділі X, які мають клас доступу ZZZ, слід дозволити належати до групи 999"), але це, як правило, не називається "референтною" цілісністю.


1

Я б сказав, покласти в базу даних. Якщо ви використовуєте стійкий фреймворк, він збирає ключі автоматично.


1

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

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

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