Сотрудничество на сайтах с реляционными базами данных и CMS - PullRequest
11 голосов
/ 26 февраля 2011

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

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

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

Наши подходы до сих пор были ограничены следующим:

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

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

Мы работаем в основном с базами данных MySQL и в настоящее время не отслеживаем изменения этих баз данных. Обсуждаемые выше проблемы относятся главным образом к сайтам Drupal и Wordpress, где значительная часть «разработки» осуществляется в связи с изменениями, внесенными в базу данных в CMS.

Ответы [ 5 ]

2 голосов
/ 04 марта 2011

Хотя вы можете поместить весь свой DDL в ВК, это может очень быстро запутаться, если вы попытаетесь управлять множеством операторов ALTER.

Заставить всех разработчиков использовать одну и ту же исходную базу данных тоже не очень эффективный подход.

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

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

2 голосов
/ 26 февраля 2011

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

1 голос
/ 05 марта 2011

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

У нас есть небольшой скрипт «отбросить все», который использует запросы к системным таблицам для идентификации каждого объекта в схеме, создает кучу SQL для их отбрасывания и запускает его. Затем у нас есть стек файлов DDL, полный операторов CREATE TABLE, затем у нас есть стек файлов XML, содержащих исходные данные для системы, которые загружаются средством загрузки. Все это проверено в системе контроля версий. Когда разработчик выполняет обновление из системы контроля версий, если он видит входящие изменения базы данных (DDL или данные), он запускает сценарий основной сборки, который запускает их для создания новой базы данных с нуля.

Хорошо, что это делает жизнь проще. Нам никогда не нужно беспокоиться о разнице, дельте, ALTER TABLE, обратимости и т. Д., Просто о DDL и данных. Нам никогда не нужно беспокоиться о сохранении состояния базы данных или поддержании ее в чистоте - вы можете вернуться в чистое состояние одним нажатием кнопки. Еще одной важной особенностью этого является то, что это упрощает настройку новой платформы - и это означает, что когда мы добавляем больше машин для разработки или когда нам нужно создать систему принятия или что-то еще, это легко. Я видел, как проекты проваливались, потому что они не могли создавать новые экземпляры из своих запутанных баз данных.

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

Проблема в том, что вы делаете с данными. У этого есть две стороны: данные, сгенерированные во время разработки, и оперативные данные.

Данные, сгенерированные во время разработки, на самом деле довольно просты. Люди, которые не работают по-нашему, по-видимому, имеют привычку создавать эти данные непосредственно в базе данных, и поэтому видят проблему в том, что они будут потеряны при перестроении. Решение простое: вы не создаете данные в базе данных, вы создаете их в сценариях загрузчика (в нашем случае это XML, но вы можете использовать SQL DML или CSV с инструментом импорта вашей базы данных или любым другим). Считайте, что скрипты загрузчика являются исходным кодом, а база данных - объектным кодом: скрипты представляют собой окончательную форму и являются тем, что вы редактируете вручную; база данных - это то, что сделано из них.

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

Проект, на котором я работаю, еще не запущен, но он заменяет существующую живую систему, поэтому у нас похожая проблема.Наш подход основан на миграции: вместо того, чтобы пытаться использовать существующую базу данных, мы переносим все данные из нее в нашу систему.Для этого мы написали довольно обширный инструмент, который запускает запросы к существующей базе данных (ее копия, а не текущая версия!), А затем записывает данные в виде сценариев загрузчика.Затем они включаются в процесс сборки, как и любые другие.Миграция выполняется по сценарию и выполняется каждую ночь как часть нашей ежедневной сборки.В этом случае усилия, необходимые для написания этого инструмента, были необходимы в любом случае, потому что наша база данных сильно отличается по структуре от старой;возможность повторяемых миграций одним нажатием кнопки предоставляется бесплатно.

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

0 голосов
/ 05 марта 2013

Там, где я работаю, мы используем Dotnetnuke, и это создает те же проблемы.т. е. после выпуска производственный сайт содержит данные, поступающие в базу данных, а также файлы, добавляемые в файловую систему некоторыми модулями и в файловой системе DNN.

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

В основном все мы разрабатываем локально с локальной копией базы данных и сайта.Если изменения являются основными, мы разветвляемся.Затем мы выполняем локальную фиксацию и выполняем слияние с RedGate, чтобы внести изменения в нашу БД на общем сервере dev.

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

Затем, чтобы начать работу, мы делаем то же самое с подготовки к работе.

Этот метод работает, но подвержен ошибкам и занимает много времени, когда необходимо внести небольшие изменения.База данных prod всегда резервируется, поэтому мы можем легко откатиться, если доставка пошла не так.

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

Мы хотели бы найти лучший метод!Поскольку у нас много проблем с ветвлением и объединением, когда проекты параллельны.

Gus

0 голосов
/ 09 марта 2011

Вы можете использовать модуль репликации ядра СУБД, если он у него есть.
Один сервер будет главным, в него должны быть внесены изменения.
Копии разработчиков будут подчиненными.
Любойизменения на ведущем устройстве будут дублироваться на ведомых устройствах.
Это односторонняя репликация.

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

Это также означает, что разработчики должны иметь две копии базы данных.
Одна будет подчиненной, а другая - базой данных для разработки.

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

Оба решения могут привести к бедствиям (ошибкам репликации).

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

...