2009-05-15 5 views
32

Это общий вопрос по дизайну базы данных. Каковы преимущества использования синонима в разработке баз данных на простом представлении? Каковы основные соображения, которые следует учитывать при выборе между ними?Каковы преимущества/недостатки использования синонимов против представления?

Пример вид:

CREATE VIEW Users AS 
SELECT * FROM IdentitySystem.dbo.Users 

И эквивалентный синоним:

CREATE SYNONYM Users 
FOR IdentitySystem.dbo.LCTs 

ответ

34

Это разные вещи. Синоним - это псевдоним для объекта напрямую, представление представляет собой конструкцию над одной или несколькими таблицами.

Некоторых причинам использовать вид:

  • Могут нужно фильтровать, присоединиться или иным образом онанировать со структурой и семантикой результирующего набора

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

  • Может обеспечить безопасность, когда часть содержимого таблицы должна быть видна классу пользователей, но не всем. Это может включать удаление столбцов с конфиденциальной информацией или фильтрацию подмножества записей.

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

  • Возможно, вы захотите объединить данные из нескольких источников.

... плюс еще много.

Причины использования синонимов:

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

  • Возможно, вы захотите перенаправить на источник, который изменяется со временем, например, в таблицу архива.

  • Вы хотите что-то псевдонизировать таким образом, чтобы это не повлияло на оптимизатор запросов.

... плюс еще много.

+0

К сожалению перетащить старую нить, но у меня есть такая же дилемма, стоит ли использовать представление или синоним. Это отличный ответ, спасибо, но на самом деле он не отвечает на вопрос – DarthPablo

+1

Возьмем 2: -C Извините, что перетащил старый поток, но у меня есть аналогичная дилемма, как использовать представление или синоним. Спасибо за хорошее объяснение. Вопрос, который у меня есть, заключается в том, есть ли какие-либо причины _not_ использовать «прямой» вид, делающий «select * from table»? Это тот бит, который вы упоминаете, с оптимизатором запросов? Одна из проблем, которую я нашел с синонимами, заключается в том, что они заставляют Hibernate жаловаться, когда проверка схемы включена, используя 'hibernate.hbm2ddl.auto = validate'. Что касается ваших причин использовать синоним, наверняка первые два могут быть рассмотрены с целью, не могли бы они? – DarthPablo

+0

Из 3 причин использования синонима первые две точки применимы к представлениям близости ('' 'create view X_table as select * from another_database.dbo.X_table''') Что касается третьей причины - 99% время, вероятно, не будет штрафа. Так что же таинственное '' '... Плюс еще много .'''? и они имеют значение? Один хороший андер дает @Jimmy Zimms – Konstantin

6

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

С точки зрения, я могу

  • скрыть столбцы
  • добавить предикаты (ИНЕКЕ) для ограничения на строки
  • переименовывать столбцы
  • дать имя столбца в выражении SQL

С синонимом я могу:

  • ссылки на объекты в других схемах и базах данных без квалификации имени

Там, наверное, больше, что может быть сделано с помощью синонимов. В проектах наших (Oracle database) приложений мы используем схему «владелец» для всех объектов базы данных (таблицы, представления, триггеры и т. Д.), И мы предоставляем привилегии этим объектам другому «приложению» "пользователей. В каждой из «пользовательских» пользовательских схем мы создаем синонимы для ссылки на объекты «владелец».

НТН

3

Вид в первую очередь представляет собой простой/сложный «выберите» заявление. По сути вы используете представление как маску и показываете только те значения столбцов, которые вам полезны. Вы используете представление с намерением не показывать дополнительную информацию конечному пользователю.

Принимая во внимание, что синоним является альтернативным именем для объектов базы данных.

  • это позволяет использовать таблицы в другой схеме без префикса имени схемы в имени таблицы с точкой как в (user.tab_name можно заменить some_synonym_name)
  • вы не заинтересованы, чтобы поделиться фактический объект с другими,
1

Пожалуйста, исправьте меня, если я ошибаюсь, но я думаю, что я вижу другое использование для синонима (по крайней мере, в Progress OpenEdge), что я не вижу документально нигде, что может сделать это еще более безопасно, чем представление. Синтаксис инструкции DML SELECT позволяет использовать таблицу, представление или синоним, но операторы INSERT, UPDATE и DELETE допускают только таблицу или представление. Некоторые представления, если они соответствуют определенным критериям, обеспечивают обновляемый, вставляемый и удаляемый доступ к данным. Синоним кажется хорошим способом обеспечить доступ к данным только для чтения, без необходимости связываться с предоставлением (или отрицанием) привилегий на представлениях.

+1

Для SQL Server вы можете предоставить SELECT, INSERT, UPDATE, DELETE для SYNONYM для таблицы. (предоставить EXEC для SP или UDF и т. д.). – tgolisch

3

Я использую синонимы для обмена объектами из других баз данных, поэтому, когда я использую .NET Framework Entity Framework, я могу использовать один объект ObjectContext для доступа ко всем требуемым данным из многих баз данных.

+0

Можете ли вы дать более подробную информацию о том, как вы это делаете? Этот ответ дает один путь, но он меньше, чем идеальный. http://stackoverflow.com/questions/6036357 – JoeBrockhaus

3

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

1

Я надеюсь, что это может помочь кому-то, я взглянул на эту статью, и я нашел повод использовать представление вместо синонима.

Когда вы используете сервер Sql как сервер Db и SAS в качестве клиента. Если вы используете синоним, он не будет распознан в вашей библиотеке SAS. Мне нужно было создать представление.

Это не оптимизировано, но, по крайней мере для Windows SAS с сервером Sql не лучший ни :)

Смежные вопросы