Денормализованное отображение многих ко многим - PullRequest
0 голосов
/ 12 апреля 2011

В SQL Server 2008 R2 у меня есть таблица со следующей структурой

(
  Id     INT NOT NULL PRIMARY KEY,
  Left1  INT NOT NULL,
  Left2  INT NULL,
  Right1 NVARCHAR(128) NOT NULL,
  Right2 NVARCHAR(128) NOT NULL,
  Right3 NVARCHAR(128) NULL,
  Right4 NVARCHAR(128) NULL,
  Right5 NVARCHAR(128) NULL,
  Right6 NVARCHAR(128) NULL
)

Используется для отображения Left1 и Left2, идущих из системы («Левая») в Right1-6, переходящих в другую систему («Правая»).

Мне нужно убедиться, что левые столбцы уникальны, что я сделал с уникальным индексом, а комбинации Левый-Правый также уникальны.

Я не могу использовать индекс здесь, потому что максимальный поддерживаемый размер столбца составляет 900 байтов. Мне нужно избегать разбиения таблицы на Left, Right и Left2Right - это слишком утомительно и подвержено ошибкам в моих случаях использования.

Как правильно применять уникальность комбинации?


Мои требования:

  • Во всей таблице НЕ ДОЛЖНЫ быть строки с одинаковыми значениями для Left1 и Left2 (решено)
  • Во всей таблице НЕ ДОЛЖНЫ быть строки с одинаковыми значениями для Left1, Left2, Right1, Right2, Right3, Right4, Right5, Right6 (здесь мне нужна помощь)

Ответы [ 2 ]

4 голосов
/ 12 апреля 2011

Нет необходимости добавлять второе ограничение.

Ваше уникальное ограничение на

Left1, Left2

предотвратит повторяющиеся значения

Left1, Left2, Right1, Right2, Right3, Right4, Right5, Right6.

Невозможно дублировать все 8 полей без предварительного дублирования первых 2.

1 голос
/ 12 апреля 2011

Одна идея: создать таблицу поиска всех возможных «правых» значений, назначить им целочисленные суррогатные ключи, использовать эти суррогатные ключи в вашей таблице Left2Right и создать для них свое уникальное ограничение. Денормализован и безобразен как грех, но это может сработать.


(Добавлено)

Вы также можете попробовать создать хеш значений и ограничить его. Версия для бедняков заключается в добавлении вычисленной строки с использованием контрольной суммы:

ALTER TABLE MyTable
 Add RightHash AS checksum(Left1, Left2, Right1, Right2, Right3, Right4, Right5, Right6)

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

...