Для чого корисні перегляди?


87

Я просто намагаюся отримати загальне уявлення про те, для чого використовуються подання в СУБД. Тобто я знаю, що таке погляд і як його скласти. Я також знаю, для чого я їх використовував у минулому.

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

  1. Для чого корисний вигляд?
    • Чи бувають ситуації, коли спокусливо використовувати подання, коли ви не повинні ним користуватися?
    • Чому ви використовуєте подання замість чогось на зразок функції, що має значення таблиці, або навпаки?
    • Чи існують якісь обставини, якими може бути корисним подання, які не видно на перший погляд?

(І для запису, деякі з цих питань навмисно наївні. Це частково перевірка концепції.)


1
схоже на запитання, розміщене тут: stackoverflow.com/questions/1278521/…
MedicineMan

Я відчуваю, що stackoverflow.com/questions/1278521/ ... надає кращі відповіді на це питання.
GinTonic

Відповіді:


42

1) Для чого корисний вигляд?

IOPO лише в одному місці

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

• Види також забезпечують абстрагуючий рівень, що перешкоджає прямому доступу до таблиць (і результуючі кайданки, що посилаються на фізичні залежності). Насправді, я вважаю, що це хороша практика 1 пропонувати лише абстрактний доступ до базових даних (з використанням переглядів та функцій, що оцінюють таблиці), включаючи перегляди, такі як 1. Я, напевно, визнаю, що є чимала фраза "Робіть, як я кажу; не як я робити "у цій пораді;)

CREATE VIEW AS
      SELECT * FROM tblData


2) Чи існують ситуації, коли спокусливо використовувати подання, коли ви не повинні ним користуватися?

Раніше продуктивність з точки зору об’єднань викликала занепокоєння (наприклад, SQL 2000). Я не фахівець, але давно про це не хвилювався. (Також я не можу думати, де я зараз використовую об’єднання подань.)

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

    • Див. Похідний опис таблиці на веб-сайті http://msdn.microsoft.com/en-us/library/ms177634.aspx

3) Чому б ви використовували подання замість чогось на зразок табличної функції чи навпаки?

(Окрім причин ефективності) Функція, що має значення таблиці, функціонально еквівалентна параметризованому поданню. Насправді, загальним простим випадком використання функції, що має значення таблиці, є просто додавання фільтру речень WHERE до вже існуючого подання в одному об'єкті.

4) Чи існують якісь обставини, які можуть бути корисними для подання, які не очевидні на перший погляд?

Я не пригадую жодного невидимого використання маківки. (Гадаю, якби я міг, це зробило б їх очевидними;)

9
Я б не погодився з тим, що має сенс створити подання на таблиці, коли це SELECT * FROM tblData. Чи можете ви запропонувати пояснення, чому це було б корисно?
Зареєстрований користувач

IOPO - Лише в одному місці - чи це добре відома дизайнерська фраза? Я не можу знайти багато посилань на це? Чи має він інші форми, наприклад, СУХИЙ?
Роберт

1
@ Роберт Так, СУХЕ, нормалізація, IOPO, це все різні смаки однієї і тієї ж філософії.
TylerH

45

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

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


21

Представлення можна використовувати для забезпечення безпеки (тобто: користувачі можуть мати доступ до подань, які отримують доступ лише до певних стовпців таблиці), подання можуть забезпечувати додатковий захист для оновлень, вставок тощо. Представлення також забезпечують спосіб імен псевдонімів (як це робить sp)), але подання є більше ізоляцією від фактичної таблиці.


18

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


-1 "погляди денормалізують"? вибачте, але це нісенітниця, якщо це якось не кваліфіковано.
просто хтось

18
Вони абсолютно денормалізують. Якщо у вас є пов’язані таблиці, які нормалізовані до третьої іменної форми, і ви створюєте подання, щоб „згладити” ці відносини, як це не денормалізація?
Кілхоффер,

11

На додаток до сказаного іншими, подання також можуть бути корисними для видалення більш завершених запитів SQL із програми.

Як приклад, замість того, щоб у програмі робити:

sql = "вибрати a, b із таблиці1 об'єднання вибрати a, b із таблиці2";

Ви можете абстрагувати це до подання:

створити подання union_table1_table2_v як
вибрати a, b з таблиці1
union
вибрати a, b з table2

а в коді програми просто маєте:

sql = "вибрати a, b із union_table1_table2_v";

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


Чому я хочу писати складний sql у базі даних замість програми?
Іван Вірабян

3
Чим складніший ваш запит, тим більша ймовірність, що він зміниться в майбутньому, частково через те, що він просто потрапляє до більшої кількості таблиць. Коли структури БД змінюються, вам також доведеться змінити свій код і зробити випуск. Якщо ця складність абстрагується у поданні, DBA може мати можливість вносити структурні зміни в таблиці базового рівня, не змінюючи ваш код.
CodingWithSpike

11

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


6

ОП запитав, чи були ситуації, коли спокусливо використовувати подання, але це недоречно.

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

Наприклад, скажімо, вам потрібно об’єднати таблиці A, B, C та D разом. Можливо, у вас виникне спокуса створити вигляд із таблиць A & B та вигляд з C & D, а потім об’єднати два перегляди разом. Набагато краще просто приєднати A, B, C та D в одному запиті.


Я не думаю, що це правильно, принаймні не так йде теорія СУБД (різні реалізації можуть вирішити не дотримуватися теорії). Синтаксичний аналізатор запитів по суті замінить усі види, які він бачить, на відповідний sql, і оптимізатор перейде звідти. Два випадки повинні бути рівнозначними.
SquareCog

Це також не відповідає дійсності, коли ви можете додавати індекси до своїх подань.
therealhoff

Я найбільш знайомий з PostgreSQL і попередні версії не дуже добре поєднували запити. Але нові - набагато кращі. Моя відповідь вже не застосовується так багато, принаймні для цієї конкретної СУБД.
Barry Brown

5

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


4

Наразі відповіді правильні - погляди корисні для забезпечення безпеки, денормалізації (хоча, якщо неправильно зроблено), більша частина цього шляху, абстрагування моделі даних тощо.

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


якщо ви денормалізуєте, додавши 7 довідкових таблиць, а потім запитуєте щось, для чого потрібна лише одна з цих довідкових таблиць. Це багато марних зусиль. Це погіршується, якщо ви починаєте приєднуватися до таких поглядів.
SquareCog

Ви впевнені в цьому? MSDN говорить: "Коли SQL Server обробляє запити, які посилаються на подання за іменами, визначення подань зазвичай розширюються, поки вони не стосуються лише базових таблиць. Цей процес називається розширенням подання. Це форма макророзширення '. Я вважаю, що під час процесу розширення движок був би досить розумним, щоб включати лише основні таблиці (подання), які потрібні для запиту.
Ентоні

Ентоні, уявіть такий запит, як "select foo_col from (select foo. *, Bar. * From foo join bar on (foo.id = bar.id)". У цьому запиті внутрішній select - це наш погляд. Це не зрозуміло, що приєднання штанги можна безпечно відмовитись (насправді, якщо відносини не суворо 1-1, це не може). Це стає ще складнішим із складнішими запитами, і я не рекомендую покладатися на загальну СУБД
Обрізання людської банки

3

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


2

Представлення - це просто збережений, названий оператор SELECT. Думайте про подання, як про функції бібліотеки.


Хіба збережені процедури більше не підходять для цього? Іноді вам потрібні функції з видами видалень та оновлень, які не відповідають цій потребі. Погляди слід розглядати як абстракції або способи обмеження цільового користувача.
HumbleWebDev

1

Я хотів наголосити на використанні поглядів для звітування. Часто виникає конфлікт між нормалізацією таблиць бази даних для прискорення продуктивності, особливо для редагування та вставки даних (використання OLTP), та денормалізацією, щоб зменшити кількість об’єднань таблиць для запитів для звітування та аналізу (використання OLAP). За необхідності, зазвичай перемагає OLTP, оскільки введення даних повинно мати оптимальну продуктивність. Тоді створення переглядів для оптимальної роботи звітів може допомогти задовольнити обидва класи користувачів (введення даних та переглядачі звітів).


1

Я пам’ятаю дуже довгий SELECT, який включав кілька СОЮЗІВ. Кожен СОЮЗ включав приєднання до таблиці цін, яка була створена на льоту за допомогою SELECT, який сам по собі був досить довгим і важким для розуміння. Я думаю, було б непоганою ідеєю мати погляд, який би створив таблицю цін. Це скоротило б загальний SELECT приблизно наполовину.

Я не знаю, чи буде БД оцінювати подання один раз, або раз кожен раз, коли було викликано. Хтось знає? Якщо перше, використання подання покращило б продуктивність.


Oracle CBO може вибрати оцінку подання один раз (матеріалізувати, вони це називають) або об'єднати SQL для подання в решту оператора select і запустити це. Він вирішить, виходячи з того, що мало нижчу кошторисну вартість.
WW.

Якщо оператор select був постійним протягом запиту і просто повторювався кілька разів, тоді загальний вираз таблиці (CTE) міг вирішити проблему. Це стосується лише SQL Server 2005/2008, оскільки він не був доступний у SQL Server 2000. Так, подання все одно було б викликане неодноразово.
Зареєстрований користувач

@ Зареєстрований користувач: CTE не є спеціальністю SQL Server. Вони виникли в DB2 і присутні і в PostgreSQL (оскільки вони корисні та відповідають стандарту ISO SQL). Незалежно від того, чи представлення вбудовано чи обробляється як чорний ящик, це залежить від реалізації, деякі СУБД розумніші за інші.
просто хтось

@ просто хтось: Мій коментар був обмежений до SQL Server 2005/2008, оскільки я не маю досвіду роботи з CTE в інших СУБД. Крім того, коментар кваліфіковано зазначив, що це не стосується SQL Server 2000, оскільки CTE не були доступні в SQL Server до 2005 року.
Зареєстрований користувач

Іншим варіантом подання було б розміщення таблиці цін заздалегідь у тимчасовій таблиці.
SeaDrive

0

Будь-коли вам знадобиться [my_interface]! = [User_interface].

Приклад:

ТАБЛИЦЯ А:

  • ідентифікатор
  • інформація

ПЕРЕГЛЯД ТАБЛИЦІ А:

  • Інформація споживача

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

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

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