Синхронизация связанных таблиц с каркасом синхронизации - PullRequest
1 голос
/ 03 февраля 2012

Текущая ситуация:

У меня есть база данных со следующей структурой:

  • Продукт
    • Категория (содержит столбец product_id)
      • Элемент (содержит столбец category_id)
        • Рейтинг (содержит столбец item_id)
        • Комментарии (содержит столбец item_id)
        • Создатель (содержит столбец item_id)

База данных работает на сервере MS SQL 2008. У меня есть несколько клиентов (с платформой синхронизации) в разных местах, которые синхронизируются с сервером в их локальный компактный файл sql.

Мой вопрос / проблема:
Я настроил filterParameter (с шаблоном) на сервере, чтобы синхронизировать только продукты с определенным идентификатором. Все подходит для таблицы Product, но для других таблиц нет.
Например, загружены все категории, загружены все элементы и т. Д. Я бы хотел, чтобы синхронизировались только категории с определенным идентификатором продукта, только элементы с этим идентификатором категории и т. Д. ...

Обычно Я бы просто соединил их вместе, но я не знаю, как это сделать в рамках синхронизации, так как не существует глобальной процедуры sql для выбора всех изменений. Но они все отдельные хранимые процедуры. Как бы я лучше всего это реализовать? При необходимости я предоставлю код или образец БД.

Приветствую Даана и заранее спасибо!

Кстати, я прочитал этот пост ( Синхронизация связанных таблиц ), но он не может применить описанный метод, так как у меня более 3 уровней в моей базе данных. Или я не прав?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2012

Лучше всего изменить схему, добавив поле product_id ко всем таблицам в базе данных. Это значительно упростит операторы фильтра и повысит производительность операций синхронизации.

Если вы не хотите изменять схему базы данных, вы можете использовать подзапросы в критериях фильтрации, как показано ниже. Кроме того, посмотрите на это обсуждение, которое обращается к этой теме: http://social.microsoft.com/Forums/en-US/syncdevdiscussions/thread/622b37ac-4229-4d34-b093-fbae0731508b.

Фильтр для таблиц Product и Category (для обеих таблиц должен быть установлен «product_id» в качестве столбца фильтра):

@"[side].product_id = @ProductId"

Фильтр по таблице товаров:

@"[side].item_id IN (
    SELECT i.item_id 
    FROM Item i 
    INNER JOIN Category c ON i.category_id = c.category_id
    WHERE c.product_id = @ProductId)"

Фильтр для таблицы рейтинга (другие таблицы на этом уровне будут похожи):

@"[side].rating_id IN (
    SELECT r.rating_id
    FROM Rating r
    INNER JOIN Item i ON r.item_id = i.item_id
    INNER JOIN Category c ON i.category_id = c.category_id
    WHERE c.product_id = @ProductId)"
0 голосов
/ 19 сентября 2014

Рассмотрите возможность добавления product_id к каждой таблице. Поскольку подход с соединениями в фильтре может не работать при удалении элемента, рейтинга, комментария и т. Д. (Подпункты). Так что будь осторожен.

0 голосов
/ 03 февраля 2012

Вы имеете в виду правильное решение, вы просто думаете, что должно быть лучшее решение.К сожалению, нет.Вы должны добавить параметр фильтра к каждому из ваших SyncAdapters, а затем вручную создать предложение WHERE или JOIN, необходимые.

Здесь - хороший обзор подхода.

...