MySQL или SQL Server

0

Я создаю приложение, которое я хочу запускать на MySQL или SQL Server (не одновременно). Я создал два класса PHP DatabaseMySQL и DatabaseSQLSVR, и я хотел бы, чтобы мое приложение узнало, какой класс базы данных для использования на основе постоянной настройки при установке.

define (DB_TYPE, "mysql" );//или "sqlsrv"

Я пытаюсь найти лучший способ справиться с этим. Моя мысль состоит в том, чтобы делать "if else" везде, где я создаю базу данных:

$db = (DB_TYPE == "mysql" )? новый DatabaseMySQL: новый DatabaseSQLSVR;

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

  • 1
    Реальность такова, что, если не использовать чрезвычайно простой SQL, вам все равно придется настраивать операторы. Но это путь, если вы хотите максимальной производительности.
  • 0
    И вы всегда можете использовать оператор switch ... case вместо if ... else if ... else. Конечно, есть гораздо лучшие решения, см. Ответы ниже
Теги:
database
sql-server

5 ответов

1
Лучший ответ

В простейших возможных терминах:

Используйте define для определения "DB_TYPE" как YourFullyQualifiedClassName, затем...

define('DB_TYPE', 'DatabaseMySQL') // or DatabaseSQLSVR or ...
$myDBType = DB_TYPE;
$db = new $myDBType();
  • 3
    Я бы порекомендовал иметь некоторый (абстрактный?) Базовый класс для наследования и проверки, действительно ли ваш новый экземпляр наследуется от этого класса (см. Php.net/instanceof ).
  • 0
    Крис, я создал суперкласс «База данных», который расширяет оба класса; Это просто казалось правильным. Но, если честно, я не уверен, как это пойдет мне на пользу в этот момент?
Показать ещё 1 комментарий
1

Вы должны изучить использование такой технологии, как PEAR.

Вот хорошая статья о PEAR. http://www.evolt.org/node/21927

  • 1
    Груша выглядит интересно. Обратите внимание, что вам все равно нужно самостоятельно писать операторы SQL для конкретной версии, чтобы либо добиться максимальной производительности, либо выполнить задачи, которые не являются стандартными SQL, но по-разному поддерживаются в разных БД.
  • 0
    Я согласен, если ваше требование заключается в поддержке нескольких СУБД, используйте библиотеку.
Показать ещё 1 комментарий
0

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

Хорошей отправной точкой было бы использовать общий набор инструментов абстракции, такой как dbx, adodb или PDO.

В каждом случае драйвер СУБД можно ссылаться как элемент данных так же, как имя пользователя или пароль - никаких условных операторов.

С.

0

Я предлагаю вам создать два объекта доступа к данным, которые выполняют различные действия DB, необходимые вашему приложению. Используйте Factory Pattern, чтобы вернуть либо реализацию MySQL, либо MS SQL, и сделать весь доступ к данным на ваших страницах PHP, используя этот объект доступа к данным.

Таким образом, вы можете настроить поведение (как предлагает OMG Ponies) по мере необходимости для каждой целевой базы данных. Если вы используете общий базовый класс, вы можете наследовать одну и ту же реализацию для обеих баз данных и предоставлять только определенную реализацию, если это оправдано (хотя я еще не сделал много OO PHP... не уверен, поддерживается ли наследование?).

  • 0
    Да, я мог бы иметь суперкласс базы данных.
0

Обычный способ состоит в том, чтобы их оба вызывали одно и то же (скажем, базу данных) и каждый помещался в отдельный файл. Тогда вам понадобится:

define(DB_TYPE, "mysql"); // or "sqlsrv"
require('db/' . DB_TYPE . '.php');

и вы могли бы просто $db = new Database();

РЕДАКТИРОВАТЬ: Обратите внимание, что для вашей системы важно правильно работать с интерфейсом, который соответственно реализуется обоими классами.

  • 1
    это могло бы хорошо испортить любую автозагрузку на месте, а также перевернуть вас, если вы используете правильную IDE (автозавершение кода не будет знать, какой класс использовать для «Базы данных»), я бы сказал, плохая идея.
  • 0
    Нет, если они реализуют тот же интерфейс. Кроме того, классы наверняка должны использовать одни и те же точные методы, чтобы все работало правильно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню