2013-12-16 6 views
3

Я хочу хранить временную информацию в базе данных. Я придумал дизайн ниже. Это лучший способ сделать это?Дизайн базы данных: история изменений истории записи (временные данные)

MasterTable

  • ID

DetailsTable

  • ID
  • MasterTableID
  • CreatedOn
  • Название
  • Содержание

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

Есть ли более чистый/стандартный способ для этого?

+0

Можете ли вы предоставить некоторые подробности о том, что вы пытаетесь сделать/магазин в этой базе данных? Я действительно не понимаю, что вы моделируете с этими сущностями. – nestedloop

+0

Я пытался ее отвлечь. На самом деле не имеет значения, что я моделировал, эта концепция должна быть верна для любых данных. –

ответ

1

Идея будет разрабатывать 2 таблицы следующим образом:

Entity таблицу: EntityId - PK, заголовок, содержание

EntityHistory стол: EntityId - ПК, версия - PK, CreatedOn, Название, содержание

Некоторые мысли о:

  • Обычно вам нужно работать только с текущей версией вашей строки, поэтому ваши запросы не будут учитывать предыдущие версии, пока вы присоединяетесь к данным и т. Д. В долгосрочной перспективе это может иметь огромное влияние на производительность, статистика не будет точной, выборочность данных может отрицательно повлиять на выбор индекса и т. д.
  • Если вы часто работаете с текущими значениями и историческим значением, вы можете определить представление как объединение на обеих таблицах.
  • Как управлять добавлением новой версии? В рамках транзакции скопируйте значения из Entity в EntityHistory (путем увеличения версии), а затем обновите строку Entity с новыми значениями. Или, альтернативно, вы можете определить триггер в таблице Entity, который будет делать трюк.
  • Используйте колонки rowversion: http://technet.microsoft.com/en-us/library/ms182776(v=sql.105).aspx
+0

Я придумал нечто похожее. Пурист во мне не любит такую ​​же информацию, которая распространяется на несколько таблиц (текущая запись в Entity, History in EntityHistory), однако я пошел с этим подходом к производительности. –

1

Просто оставьте мастер-класс.

Строки в вашей детали. Таблицы по-прежнему будут «связаны друг с другом», как вы ее называете, с одинаковым значением столбца идентификатора.

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

+1

Возможно, для генерации идентификаторов может потребоваться мастер-таблица, но это может быть заменено на последовательности в более поздних версиях SQL Server. – RBarryYoung

+0

К сожалению, именно поэтому он есть. Первоначально у меня был заголовок и содержание в главной таблице, но я понял, что это может измениться. –

+0

Как __user__ идентифицирует то, о чем он ведет данные? –

Смежные вопросы