Как разработать схему базы данных, которая может использоваться как с MySQL, так и с SQL Server? - PullRequest
4 голосов
/ 12 ноября 2008

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

Ответы [ 10 ]

5 голосов
/ 12 ноября 2008

Google для различий в типах данных.

Но схема - это только часть картины.

Диалекты SQL тоже разные. Google для тех различий. Затем либо придерживайтесь подмножества SQL, общего для обоих, либо создайте схему, в которой каждый из них будет использовать несколько иной SQL.

Не ждите до конца, чтобы проверить на "другом" БД. Протестируйте оба с самого начала, чтобы не вкладывать слишком много средств в тупиковое направление проектирования.

Вот стартовое место:
http://www.microsoft.com/technet/prodtechnol/sql/2000/deploy/mysql.mspx#EZD
и:
http://troels.arvin.dk/db/rdbms/#insert

4 голосов
/ 12 ноября 2008

Вот четыре моих основных принципа разработки кросс-баз данных:

  1. Не используйте пробелы в именах для ничего
  2. Не используйте ключевые слова из базы данных в качестве имен столбцов (ORDER, DATE и т. Д.)
  3. Используйте самые простые типы столбцов (CHAR, INT). Различия в столбцах типа «Дата» и «Временная метка», вероятно, в какой-то момент сбивают вас с толку, поэтому избегайте их, если это возможно (я знаю, что это не совсем реалистично).
  4. Денормализовать больше, чем вы думаете, уместно. Чем сложнее и СОГЛАСЕН ваш запрос, тем больше вероятность того, что вам придется поддерживать парные версии ваших запросов, специфичные для БД, чтобы все работало приемлемо в обеих базах данных. Как только вы там, вы обречены.

1 и 2 - это действительно одна и та же проблема - все базы данных позволяют экранировать имена объектов (поэтому вы можете иметь имена с пробелами и именами, такими как ORDER и DATE), но обычно они делают это по-разному, поэтому этот запрос для SQL Server:

SELECT [ORDER], [Why This Name] FROM [Table From Hell]

должно быть

SELECT "ORDER", "Why This Name" FROM "Table From Hell"

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

1 голос
/ 03 января 2010

Mysql предоставляет функцию экспорта, которая позволяет экспортировать вашу схему в формат, совместимый с SQL Server.

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

1 голос
/ 12 ноября 2008

В зависимости от того, какой язык вы используете, вы можете вставить промежуточный слой ORM, такой как (например) Doctrine PHP, который должен помочь вам не писать напрямую SQL. В других комментариях есть несколько замечательных предложений относительно исходной схемы.

1 голос
/ 12 ноября 2008

В этой статье описаны некоторые основные отличия.

Различия между MSSQL и mySQL

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

0 голосов
/ 02 декабря 2009

Dazanamic DeZign для баз данных поддерживает независимое от базы данных моделирование.

0 голосов
/ 13 ноября 2008

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

Спецификацию домена будет сложно определить в терминах, которые не благоприятствуют одному диалекту SQL над другим.

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

В приложении используйте SQL с наименьшим общим знаменателем везде, где только можно, без чрезмерного снижения производительности или гибкости кода. Там, где это необходимо, используйте специальные методы для внутреннего интерфейса. Скройте эти серверные зависимости внутри нескольких объектов. Сделать большинство приложений СУБД независимыми.

0 голосов
/ 12 ноября 2008

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

Во-первых, типы данных различны и имеют разные способы обработки данных. Это особенно сложно при обработке дат и больших объемов текста.

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

Другой подход заключается в использовании хранимых процедур и записи по одному для каждой поддерживаемой вами базы данных, но с одинаковыми именами в базах данных. Таким образом, вы можете воспользоваться преимуществами настройки производительности, доступной для каждой базы данных, и различными структурами базы данных без необходимости изменения пользовательского интерфейса, но его гораздо сложнее поддерживать, поскольку каждое изменение должно быть записано для каждой базы данных. Однако, вероятно, это будет намного быстрее для ваших пользователей, чем у ваших конкурентов, поэтому вы сможете изменить премиальную цену за продукт. Вам нужно будет взимать дополнительную плату, хотя из-за дополнительных затрат на обслуживание и дополнительных специалистов по базам данных, которые вам понадобятся для настройки производительности для каждого типа базы данных (специалист по MySQL, вероятно, не будет знать, как лучше настроить базу данных SQL Server). и наоборот)

Альтернативой для рассмотрения является то, что вы размещаете данные, и пользователи получают к ним доступ из Интернета. Тогда вам нужно только разработать и поддерживать одну базу данных по вашему выбору. Для этого вам понадобится целая куча серверов, сети и сотрудников dba, поскольку для каждого клиента вам потребуется поддерживать круглосуточную работоспособность, и они могут потребовать, чтобы вы хранили их данные на серверах, которые не содержат данных от конкурентов. Не зная бизнеса, для которого вы разрабатываете программное обеспечение, трудно сказать, является ли это жизнеспособной альтернативой.

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

0 голосов
/ 12 ноября 2008

Если вы загружаете и используете VisioModeler для захвата вашего концептуального и / или логического проекта, он довольно неплохо выделяет DDL для эквивалентного физического дизайна для нескольких РСУБД.

http://www.microsoft.com/downloads/details.aspx?familyId=27fe6786-a439-4286-b8b6-7a9b84cfa709&displaylang=en

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

http://www.fabforce.net/downloads.php

0 голосов
/ 12 ноября 2008

Один из "веселых" вариантов - вообще не писать SQL. Создайте систему, в которой вы можете абстрагироваться от спецификации того, что вы хотите сделать, а затем сгенерировать схему / запросы и т. Д. У меня есть проект, в котором я строю код SQL с помощью процессора C pre.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...