У нас есть много клиентов, использующих наше приложение, и каждый из них имеет свою собственную, идентично структурированную базу данных на нашем MS SQL Server. У нас также есть центральная база данных для информации, которая является инвариантной и поэтому распространена среди всех клиентов, таких как база данных USPS ZIP Code. Каждая клиентская база имеет вид этих таблиц, например:Как управлять общими или настраиваемыми таблицами
create view V_ZIPCode as
select ID, ZIP, City, State
from SharedDB..ZIPCode
клиенты не имеют права на изменение данных в SharedDB.
Есть, однако, некоторые таблицы, в которых данные будут в основном быть общим - но клиенты могут захотеть добавить несколько собственных записей.
Так что мне интересно, как лучше всего реализовать эту ситуацию.
Я мог бы просто поместить таблицу в базу данных клиента и предварительно заполнить каждый клиент общими записями, но это кажется слишком тяжелым и неэлегантным. И, конечно же, если общие записи обновляются по любой причине, изменения не будут распространяться на клиентов автоматически; Мне придется скопировать данные на все клиентские dbs, что очень неприятно.
Еще одна идея у меня была в том, чтобы создать идентичные таблицы в SharedDB и клиентской БД, а затем создать представление о клиенте БД так:
create view V_MyTable as
select ID, Description, convert(bit, 0) IsClientData from SharedDB..MyTable
union
select ID, Description, 1 from MyTable
Для того, чтобы предотвратить ID дублирования, я мог засеять личность значение на клиентских таблицах на очень большом количестве, таком как 1,000,000 (путь больше, чем я когда-либо использовал в центральной базе данных, это довольно стабильные значения поиска); Я не уверен, что мне понадобится это поле IsClientData
, но это небольшая деталь. Клиент сможет выбирать все, что захочет, используя представление, но они смогут изменять данные в таблице только в своей собственной базе данных.
Этот подход имеет несколько недостатков, которые я вижу: во-первых, я не смог бы иметь внешние ключи в любой таблице, ссылающейся на это представление, - но я думаю, что это имеет место с любой ссылкой на другую база данных. Другим является то, что я не уверен, насколько эффективно это представление будет в запросе.
Можете ли вы увидеть какие-либо другие проблемы, которые этот подход представит? Можете ли вы рекомендовать какие-либо оптимизации? Или вы порекомендовали бы совсем другой подход?
Если это имеет значение, бизнес-уровень приложения написан на C# с использованием Linq-to-Sql.
Интересная идея, которая работает для создания и чтения, хотя она создает небольшую проблему, когда дело доходит до обновления и удаления. Вы должны иметь возможность обновлять и удалять данные клиента, но не обмениваться данными. Не будет ли их всех на одном физическом столе сделать это очень сложно? –
+1 для интересной идеи, BTW ... :) –
Если клиентские данные сильно изменяются (вставляются, обновляются, удаляются), то да, это становится сложно. Если бы я пошел с чем-то подобным (и это в значительной степени «мысленный эксперимент», я бы посмотрел на триггеры INSTEAD OF на представлениях. Хм, становится уродливым ... возможно, стоит только делать, если данные должны быть в одном месте , например, для бизнес-логики или причин FK. –