Intereting Posts
CakePHP: вызов функции-члена функции () на не-объекте usort (): Массив был изменен функцией сравнения пользователей Избегайте общей папки laravel и открывайте непосредственно корень на веб-сервере Неустранимая ошибка: исключить исключение «Parse \ ParseException» с сообщением «Ошибка SSL-сертификата: невозможно получить сертификат локального эмитента» В PHP есть ли способ захватить вывод файла PHP в переменную без использования буферизации вывода? Массивы слияния PHP по значению Localhost не отображает те же компоненты, что и на сервере. Почему PHPStorm говорит «dyld: библиотека не загружена: /usr/local/lib/libpng15.15.dylib», когда я запускаю тесты? Маршрутизация, управляемая базами данных в CodeIgniter 2.x обходите ошибку allow_url_include = 0 Использование API входа в Paypal Как сохранить значение выбранного пользователем параметра из выпадающего списка выбора в базу данных mysql? Преобразование регулярных выражений PHP в c # ошибка отправки электронной почты с помощью Mandrill (php) Когда __destruct не будет вызываться в PHP?

Создать представление или использовать innerjoins?

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

Я планирую получить доступ к этой базе данных с PHP для основного интерфейса / бэкэнд-дисплея. Теперь мой вопрос исходит из этих двух рассмотренных запросов:

CREATE VIEW `view` AS SELECT functiondetails.Detail, functionnames.ID, functionnames.FunctionName, functionnames.Catogory FROM functiondetails INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID 

или

 SELECT functiondetails.Detail, functionnames.ID, functionnames.FunctionName, functionnames.Catogory FROM functiondetails INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID 

В запросе нет ошибки, поскольку я запускал оба без проблем, но мой общий вопрос:

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

 $Query = $MySQli->prepare(" SELECT functiondetails.Detail, functionnames.ID, functionnames.FunctionName, functionnames.Catogory FROM functiondetails INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID ") $Query->execute(); $Results = $Query->fetch_results(); $Array = $Results->fetch_array(MYSQLI_ASSOC); 

Или выбрать из моего представления?

 $Query = $MySQLi->prepare("SELECT * FROM `view`"); $Query->execute(); $Results = $Query->fetch_results(); $Array = $Results->fetch_array(MYSQLI_ASSOC); 

Итак, какой из них был бы лучшим методом для запроса моей базы данных?

Solutions Collecting From Web of "Создать представление или использовать innerjoins?"

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

Некоторые из больших преимуществ использования представлений включают в себя:

  1. Безопасность
    Вы можете контролировать, кто имеет доступ к просмотру, не предоставляя им доступ к базовым таблицам.

  2. осветление
    Часто заголовки столбцов не так наглядны, как могут быть. Представления позволяют добавлять ясность к возвращаемым данным.

  3. Представление
    Производительность мудрых, взгляды не нанесут вам вреда. Однако вы не увидите прироста производительности при использовании представлений, поскольку MySQL не поддерживает материализованные представления .

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

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

    Например, скажем, у вас есть таблица, которая содержит дома, которые вы homes_for_sale , homes_for_sale , но позже вы решите, что хотите, чтобы эта таблица обрабатывала все дома, которые вы когда-либо продавали / продавали в настоящее время, all_homes . Очевидно, что схема новой таблицы будет сильно отличаться от первой.

    Если у вас есть тонна запросов, вытаскивающих из homes_for_sale , теперь вам нужно пройти весь свой код и обновить все запросы. Это открывает вам ошибку пользователя и кошмар управления.

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

Вы можете предположить, что MySQL хранит результаты просмотра где-то, и обновления, которые возникают при изменении данных в базовых таблицах. MySQL этого не делает. Запрос в виде в точности соответствует выполнению запроса.

Но это может быть даже хуже, чем запуск голого SQL-запроса, поскольку MySQL может накапливать результаты базового запроса во временной таблице, чтобы вы могли использовать дополнительные предложения SQL в своем запросе против представления. Я говорю «может», потому что это зависит от алгоритма просмотра.

См. http://dev.mysql.com/doc/refman/5.6/en/view-algorithms.html для описания того, как MySQL использует алгоритм «merge» или «искушаемый» алгоритм для выполнения представления.

Если вы хотите материализованные представления, есть инструмент под названием FlexViews, который поддерживает материализованные представления:

Flexviews – это реализация материализованных представлений для MySQL. Он включает простой API, который используется для создания материализованных представлений и для их обновления. Преимущество использования Flexviews заключается в том, что материализованные представления постепенно обновляются, т. Е. Представления обновляются эффективно, используя специальные журналы, которые записывают изменения в таблицы базы данных. Flexviews включает инструменты, которые создают и поддерживают эти журналы. Представления, созданные Flexviews, включают поддержку JOINs и всех основных функций агрегации.

Представление – это просто хранимый текстовый запрос. Вы можете применить к нему ГДЕ и ЗАКАЗ, план выполнения будет рассчитан с учетом этих положений. Я думаю, было бы полезно, если бы вы захотели сохранить свой код «чистым». Что нужно иметь в виду, так это то, что изменить представление немного сложнее, поэтому, если вы не совсем уверены в столбцах или измените последнее, придерживайтесь запроса.

О производительности – ТО ЖЕ!

С наилучшими пожеланиями!

Создание представления предпочтительнее, если вы:

  • Уверен, что требуемые столбцы
  • Хотите снова использовать свое мнение в другом месте
  • Вам нравится кодирование абстрактным образом. (Скрытие технических деталей)
  • Нужен быстрый доступ, создавая на нем индекс.
  • Конкретный доступ к нескольким пользователям (точка взята из комментариев)

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

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

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

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

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