Хорошо это или плохо, но у нас есть решение, основанное на нескольких базах данных, которые ссылаются на общую административную базу данных. Базы данных поставляются как часть модулей, и не все модули требуются для установки (возможно, именно поэтому у нас вообще есть несколько баз данных). Однако необходима административная база данных ... так что она всегда будет там.
Я хотел бы внести некоторую ссылочную целостность и порядок в хаос, но я загнан в тупик из-за неспособности SQL-сервера создавать внешние ключи между базами данных. В базе данных НЕ много оттока, но информация будет вставлена / обновлена (кхм) нетехническими пользователями.
Мой выбор, как я их вижу:
а) Наложить псевдо внешний ключ с помощью триггеров (хорошо, но немного поработать)
б) Используйте триггеры для репликации от администратора в другие базы данных (четкий рецепт катастрофы)
c) Ввести псевдо внешний ключ в код / DAL (плохо работает с ORM)
г) Не беспокойтесь об этом на уровне БД, используйте хороший дизайн пользовательского интерфейса, чтобы убедиться, что никто не делает глупостей, и ограничивайте доступ / задержку дыхания при прямом доступе к SQL.
Честно говоря, я склоняюсь к «Д», но решил, что буду искать мнения умнее меня ...





У нас точно такая же проблема, и, честно говоря, это отстой. Нашим единственным эффективным решением, которое мы сочли эффективным, был вариант D и использование бизнес-уровня, чтобы попытаться синхронизировать вещи (заключенные в транзакции и т. д.)
Предполагая, что каждый модуль настроен так, что он связан с административной базой данных, вы можете упростить задачу, настроив представления для административных таблиц в каждой модульной базе данных.
Использование представления таким образом даст вам возможность выбора во внешнем ключе, реализованном триггером, что упростит задачу.
В зависимости от реализации вашей базы данных вы часто сможете связать таблицы из другой базы данных (AdminDB), и они появятся в ваших различных базах данных модулей.
В Microsoft Access вы можете связать таблицы, щелкнув правой кнопкой мыши и выбрав источник данных ODBC. В Oracle они называют это ссылкой на базу данных. Я готов поспорить, что SQLServer имеет некоторую форму этой реализации не реализует настраиваемую репликацию для одной таблицы.
После того, как вы свяжете свои внешние административные таблицы с базами данных модулей (или наоборот), вы сможете определять ограничения, как если бы таблицы находились в одной схеме.
Второй вариант может быть еще проще. Что, если бы вы использовали одну и ту же схему для всех модулей и базы данных администратора? Вы знаете, что база данных администратора присутствует, поэтому просто запустите сценарий создания таблицы для этой схемы. Пока нет конфликтов именования таблиц / представлений / хранимых процедур, тогда все должно работать, просто изменив dblogin во всех модулях на соответствие.
У нас такая модульность в наших продуктах, но наши требования к базе данных объединяются во время установки. Например, наш административный пакет и продукт A могут быть первоначальной покупкой клиентом, при котором они устанавливают два модуля в базу данных X. Если они позже купят продукт B, компонент базы данных размещается прямо поверх базы данных X, добавляя в DRI, где это необходимо.
Единственный случай, когда я увидел необходимость в отдельных базах данных с точки зрения дизайна, - это когда вы проводите жесткую границу между бизнес-единицами (например, корпорацией), и в этот момент проблема действительно связана с типом разделения. Great Plains Dynamics делает это там, где у них есть одна административная база данных и несколько корпоративных баз данных. Однако каждый модуль в GP для данной корпорации находится в этой единой базе данных.
Конечно, если вы застряли с отдельными базами данных, я соглашусь, что D - лучший вариант.
Думаю, это зависит от критичности вашего приложения. Хотите ли вы продолжить, возможно, в ограниченном режиме, работу, если эта база данных администратора выйдет из строя. Если вы скажете, ни в коем случае, если администратор не работает, все приложение должно быть немедленно остановлено, чем все, что было сказано до сих пор, в порядке.
Если вы скажете: «Ну и дела, есть еще много работы, которую можно было бы сделать без admin db». тогда я бы спросил, почему вы считаете, что однонаправленная репликация настолько экзотична, что это явный рецепт катастрофы?
Создание копии таблицы - это вообще не ракетостроение. На самом деле это так же просто, как дублировать ключ от дома. Каждая вершина и впадина мастера передается отрезному кругу, который формирует заготовку. В репликации с несколькими мастерами есть некоторая магия: если вы начнете разрешать изменения в удаленных базах данных для данных, которые поступают из данных администратора, тогда вы серьезно подумаете о проектировании.
Я не говорю, что это ИДЕАЛЬНЫЙ способ, вы должны сначала ответить на мой первоначальный вопрос. После этого, если вы действительно хотите продолжить работу ... не сбрасывайте со счетов жизнеспособность репликации.
Интересно, есть ли у SQL Server такая функция, как материализованные представления Oracle? Это объект, который вы определяете с помощью запроса, такого как представление, но результаты запроса сохраняются в виде таблицы. Затем существуют различные механизмы для автоматического обновления.
Если есть такая функция, я бы предложил создать материализованное представление основных таблиц в каждой вспомогательной базе данных. Затем вы можете указать это в своих внешних ключах. Основная проблема заключается в том, можно ли его обновлять достаточно часто для ваших нужд.
Вам следует реализовать сервис-ориентированную архитектуру. Где разные службы в системе работают со своей схемой базы данных. Тогда позвольте вашим приложениям работать независимо от любых баз данных, но позволить им работать против сервисов.
Вы можете решить эту проблему несколькими способами с архитектурной точки зрения, чтобы направлять все изменения через центральную службу, чтобы они не могли вносить несоответствия, но независимо от того, сколько усилий вы готовы приложить для этого (и создавая узкое место или единственное место). точка отказа может нарушить некоторые другие требования, которые у вас есть) вы не сможете полагаться на сам движок базы данных, чтобы обеспечить его соблюдение с гарантией, как вы можете с ограничением FK.
Мне часто приходилось иметь дело с этим в ситуациях с межведомственными базами данных, когда что-то могло рассинхронизироваться, потому что разрозненные системы еще не были полностью интегрированы или соображения безопасности требовали, чтобы у них были отдельные администраторы.
В этих случаях я обычно полагаюсь на отчеты об исключениях, генерируемые ежечасно, которые проверяют состояние вещей и сообщают только в случае возникновения проблемы. Задания агента SQL Server обладают мощными возможностями планирования. Я всегда использовал таблицы журналов и SQLAnswersMail для создания красивых небольших электронных писем в формате HTML (где URL-ссылки в электронных письмах могут даже привести вас на страницы администрирования для устранения проблем) различным системным администраторам, но есть множество способов избавиться от этой кошки.
Я думаю, что самое забавное ... вы можете сделать небольшую копию базы данных MS Access, применить RI в Access ... и затем увеличить размер, и Microsoft Access дает вам возможность выбирать между использованием триггеров или DRI ... и я Я почти уверен, что Microsoft Access напишет за вас основные части триггеров.
Пока мы обсуждаем эту тему, я ненавижу MS Access ... но одна вещь, которая превосходит Access, это то, что вы можете принудительно использовать RI против QUERY (sql select, aka view). Я действительно хочу, чтобы у MS SQL Server был та же функциональность.
Утверждение о принудительном использовании RI с запросами неверно. Вы можете создать ОТНОШЕНИЕ, но оно не может обеспечить реляционную целостность - оно просто устанавливает строки отношений по умолчанию, когда вы перетаскиваете таблицы в конструктор запросов.
Для увеличения размера баз данных Jet / ACE до SQL Server помощник по миграции SQL Server очень хорош. Это позволяет вам протестировать увеличение размера и узнать, какие вещи не работают должным образом, чтобы вы могли исправить их, прежде чем выполнять фактическое увеличение размера. Мастер увеличения размера этого не делает. Есть кое-что, чего он не делает (некоторые простые правила проверки игнорируются), но он получает почти все.
Я предпочитаю преобразование Access в SSMA, потому что расширение Access поддерживает переход к проектам Access Data. В любом случае, для большинства небольших проектов Access - 10 таблиц и 50 запросов - я могу увеличить размер и переписать запросы за час или два. Преимущества использования SQL Server в производительности огромны.
Но мастера увеличения размера всегда отстают, по крайней мере, на одну версию, и у них нет возможности протестировать его перед запуском. SSMA не зависит от вашей версии Access и позволяет проводить предварительное тестирование. И он преобразует больше вещей, чем мастера увеличения размера, поэтому после его запуска остается намного меньше работы.
конвертирует больше вещей, чем мастера увеличения размера .. например .. вы говорите, что он конвертирует формы / отчеты? Поддерживает ли он ADP? Если он не поддерживает ADP, я бы предпочел просто использовать службы интеграции SQL Server :)
Нет, он преобразует больше свойств таблиц Access, таких как правила проверки, с которыми мастер увеличения размера не может справиться.
ну, это не похоже на то, что метод -any- преобразует функции VBA в функции VB.net .. вот как на самом деле работает должен.
Мы подумали об этом, и это немного помогает. Однако проблема остается в том, что вы также не можете повесить внешний ключ на представление в SQL-сервере. Но хорошая мысль.