Являются ли изменяемые виды соединений разумным выбором дизайна? - PullRequest
6 голосов
/ 05 апреля 2011

Для ясности, под модифицируемым объединением представлением Я имею в виду представление, построенное из объединения двух или более таблиц, которое позволяет вставлять / обновлять / удалять действия, которые изменяют любые / всетаблицы компонентов.

Это может быть конкретный вопрос postgres, не уверен.Меня также интересует, имеют ли другие СУБД уникальные функции для изменяемых представлений объединения, поскольку, насколько я могу судить, они невозможны в стандартном SQL.

Я работаю над схемой postgres, и некоторые из моихНедавнее чтение показало, что можно создавать изменяемые виды объединения, используя вместо этого правила (CREATE RULE ... DO INSTEAD ...).Представления с изменяемым соединением кажутся желательными, поскольку они позволяют скрыть сильную нормализацию за интерфейсом, обеспечивая механизм для классической абстракции.Правила являются единственным вариантом реализации, поскольку в настоящее время триггеры не могут быть установлены для представлений .

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

Вопросы (отредактируйте, чтобы задать более точные вопросы):

  • Есть ли у вас опыт работы с изменяемыми представлениями соединений и можете ли вы привести конкретный пример с возможностью выбора / вставки / удаления / обновления?
  • Являются ли они практичными, то есть могут ли они быть прозрачными без необходимости ходить на цыпочках вокруг мин / черных дыр?
  • Являются ли они когда-либо хорошим выбором дизайна с точки зрения функциональности / соотношения усилий и ремонтопригодности?

Буду очень признателен за ссылки на любые примеры / обсуждения по этой теме.Спасибо.

Ответы [ 7 ]

5 голосов
/ 08 апреля 2011

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

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

Я не думаю, что правила действительно отличаются от любых других функций в любой другой среде.И под средой я имею в виду C, C ++, Java, Ruby, Python, Erlang и BASIC, а не только среды dbms.

Используйте хорошие возможности языка.Избегайте плохих.

"Не используйте malloc ()" - плохой совет.«Всегда проверяйте возвращаемое значение malloc ()» - хороший совет.«Никогда не используйте правила» - плохой совет.«Избегайте использования правил способами, которые, как известно, имеют сомнительное поведение» - это хороший совет.Правила, необходимые для представлений таблиц супертипов / подтипов, просты и понятны.Они не ведут себя неправильно.

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

2 голосов
/ 08 апреля 2011
2 голосов
/ 05 апреля 2011

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

Люди отмечают, что переписывание правил не является реальной таблицей (но она изображается как одна), что позволяет писать вещи, которые могут сломаться. Это возможно, но я еще не сталкивался с этим. Идея состоит в том, чтобы скрыть сложность в перезаписи, а затем делать только простые удаления и обновлять с без объединений . Если выясняется, что требуется объединение - пришло время переписать правило, а не запрос верхнего уровня.

В конце я нахожу очень компактный способ написания базы данных. Все способы взаимодействия с ним написаны как правила. Ни одно соединение не должно иметь доступа к реальной таблице. Ваша бизнес-логика очень четкая. Если представление не имеет правила UPDATE, оно не может быть обновлено. Поскольку вы написали все это на уровне базы данных, а не на уровне клиента, это не связано с веб-фреймворком или конкретным языком. Это приводит к большой гибкости в том, как вы хотите подключиться к базе данных. Представьте, что вы использовали веб-фреймворк, но со временем вам нужен прямой доступ к базе данных для другого источника. Прямой доступ также обойдет все бизнес-правила ORM, над которыми вы так усердно работали. С интерфейсом записи правил, который вы можете выставить, интерфейс, не опасаясь, что новое соединение повредит данные.

Если люди говорят, что вы действительно можете ОБНОВИТЬ базу данных с ними - тогда, конечно, - конечно, вы можете. Но вы можете и со всем остальным тоже. Если бы люди сказали, что вы не можете использовать их вообще без всяких проблем, я бы не согласился.

1 голос
/ 05 апреля 2011

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

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

0 голосов
/ 15 апреля 2011

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

0 голосов
/ 13 апреля 2011

Я никогда не использовал модифицируемые представления любого вида, но, поскольку вы спрашиваете, являются ли они "разумным выбором дизайна", могу ли я предложить альтернативный выбор дизайна со многими преимуществами, когда модифицируемые представления не нужны: Транзакционный API

В основном это составляет:

  • Пользователи не имеют доступа к таблицам и не могут вообще выдавать операторы insert, update, delete
  • Пользователи имеют доступ к функциям, которые представляют четко определенные транзакции - на простейшем уровне они могут просто выполнять один DML, но часто этого не происходит.Важно то, что они сопоставляются с транзакциями в «деловом» смысле, а не в смысле «базы данных»
  • Для запросов пользователи имеют доступ к (неизменяемым) представлениям
0 голосов
/ 08 апреля 2011

Я знаю, что в SQL Server, если вы обновляете представление, вы все равно должны ограничить изменение только одной таблицей, что делает использование представлений для обновления бесполезным, на мой взгляд, так как вы должны знать, какие поля с какими таблицами все равно идут.1002 * Если вы хотите абстрагировать информацию и не беспокоиться о структуре базы данных для вставок и обновлений, ORM должен работать для вас лучше, чем представления.

...