извините за поздний ответ, меня поразил серьезный случай уикенда.
Что касается использования третьей таблицы для включения PK из клиентских и системных таблиц - мне это не нравится, поскольку это слишком усложняет синхронизацию и все еще требует, чтобы мое приложение знало третью таблицу.
Другая проблема, которая возникла, состоит в том, что у меня есть третья таблица, которая должна ссылаться на элемент - системный или клиентский, это не имеет значения. Разделение таблиц в основном означает, что мне нужно иметь два столбца, ClientItemID и SystemItemID, каждый из которых имеет ограничение для каждой из своих таблиц с обнуляемостью - довольно некрасиво.
В итоге я выбрал другое решение. Вся проблема заключалась в том, чтобы легко синхронизировать новые системные элементы в таблицах, не связываясь с клиентскими элементами, избегая коллизий и т. Д.
В итоге я создал только одну таблицу Items. У элементов есть битовый столбец с именем «SystemItem», который определяет очевидное. В моей базе данных разработки / системы у меня есть PK как int int (1,1). После того, как таблица была создана в клиентской базе данных, ключ идентификации изменяется на (-1, -1). Это означает, что элементы клиента уходят в минус, в то время как системные элементы уходят в плюс.
Для синхронизации я в основном игнорирую что-либо с (SystemItem = 1) при синхронизации остальных, используя IDENTITY INSERT ON. Таким образом, я могу синхронизироваться, полностью игнорируя элементы клиента и избегая коллизий. Я также могу ссылаться только на одну таблицу «Элементы», которая охватывает как клиентские, так и системные элементы. Единственное, что нужно иметь в виду, это исправить стандартный кластеризованный ключ, чтобы он убирался, чтобы избежать всех видов реструктуризации страницы, когда клиент вставляет новые элементы (обновления клиента по сравнению с обновлениями системы, как 99% / 1%).