Объединение нескольких таблиц для повышения производительности? - PullRequest
1 голос
/ 09 марта 2010

Если у меня есть такая структура таблицы:

Транзакция [TransID, ...]

Документ [DocID, TransID, ...]

Signer [SignerID, ...]

Подпись [SigID, DocID, SignerID, ...]

И бизнес-логика выглядит так:

  • Транзакции могут иметь несколько документов
  • Документы могут иметь несколько подписей
  • И тот же подписчик может иметь несколько подписей в несколько документов в пределах та же транзакция

Итак, теперь к моему актуальному вопросу:

Если бы я хотел найти все документы в конкретной транзакции, было бы лучше с точки зрения производительности, если бы я также сохранил TransID и DocID в таблице Signer, чтобы у меня были меньшие объединения. В противном случае мне пришлось бы присоединиться через Подпись> Документ> Транзакция> Документы, чтобы получить все документы в транзакции для этого подписавшего.

Я думаю, что очень грязно иметь такое количество связей в таблице Signer, хотя и не кажется «правильным» делать это таким образом (также это похоже на кошмар обновления), но я вижу, что это может быть лучшая производительность для прямых присоединений. Мысли?

ТИА!

Ответы [ 3 ]

11 голосов
/ 09 марта 2010

Перейти с нормализованной версией. Только пересмотреть, если производительность становится проблемой. Другим вариантом является опасность технического обслуживания.

4 голосов
/ 09 марта 2010

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

1 голос
/ 09 марта 2010

Я также укажу, что сохранение идентификатора транзакции в таблице подписавшего не будет работать, так как подписчики могут участвовать в нескольких транзакциях.

Это такой маленький, крошечный, несложный запрос, что вряд ли объединения будут проблемой, если они правильно проиндексированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...