Проектиране на моментни снимки в транзакционна база данни заедно с версии на референтни данни

Отказ от отговорност: Прочетох всичко, което мога да прочета по темата за моментни снимки и версии както при препълване на стека, така и в интернет. Моето изискване не е проследяване на версии за одитна пътека или моментни снимки на ниво база данни. Прекарах повече от 1 седмица, за да проуча сам и да обмисля възможните варианти. Съжалявам, може да съм пропуснал някои връзки - ако решението на моя проблем вече е обсъждано в друга тема, моля, насочете ме там.

Малко е дълъг; Моля, почакайте ме.

Ето каква е ситуацията: Опитваме се да създадем общ дизайн за съхраняване на моментни снимки на транзакционните данни в нашата транзакционна база данни и също така да поддържаме хронология на ревизиите на референтните данни.

Като част от бизнес процеса, потребителят може да натисне бутон, за да публикува определен обект. За целите на илюстрацията нека кажем, че потребителят може да публикува предложение от доставчика преди началото на преговорите. След това, в различни моменти от време през процеса на договаряне, потребителят може да публикува данните за предложението. Предложението съдържа бюджет, цели за продажби и много други елементи. Когато дадено предложение е моментално заснето, трябва да бъдат направени моментни снимки на всички свързани обекти. Накрая, след преговорите, се подписва договор. В този момент трябва да се създаде пълна моментна снимка на договора. Не всички обекти в договора присъстват в предложението – има много припокриващи се обекти, но има уникални обекти, прикачени към предложението и договора.

Трябва да поддържаме налични както тези публикувани версии, така и най-новите активни версии. Публикуваните версии са достъпни на уебсайт, за да бъдат препращани както от доставчиците, така и от мениджърския екип. Не всички публикувани версии са достъпни на уебсайта, но последното публикувано предложение и последният публикуван договор винаги са достъпни на уебсайта. Този уебсайт също трябва да бъде попълнен от същата база данни.

Освен това финансовият потребител може да реши да направи моментна снимка само на бюджета, а мениджърът по продажбите може да направи моментна снимка на целите за продажби. Така че моментните снимки са налични с множество степени на детайлност.

Също така имаме изискване да проследяваме версиите на основните данни. Бизнес изискване е да се проследяват всички промени в основните основни колони с данни във времето. Например, имаме регионална информация, свързана с целите за продажби. Името на региона може да се промени и ние искаме да проследим тези промени. Да приемем, че по време на предложението името на региона е R1 и е създадена моментна снимка. След това името на региона се променя на R2 и след това се създават 2 други моментни снимки. Искаме да можем да свържем целите за продажби с правилното име на регион в тези моменти от време, а не непременно с последното име на регион.

Имаме известна гъвкавост при моделирането, тъй като имаме както база данни за транзакции, така и база данни за хранилище на данни и можем да решим да съхраняваме част от тази информация или в база данни за транзакции, или в база данни за хранилище на данни.

Ето нашия дизайн. Имаме таблица за публикации, която улавя основна информация за публикуваните данни – кой е публикувал и датата, причината и вида на публикувания обект (предложение или бюджет или цели за продажби).

Ние съхраняваме моментните снимки в същата таблица като оригиналните данни. Така че моментните снимки на предложенията ще се съхраняват с предложенията на живо в таблицата с предложения. Във всяка таблица имаме колона, наречена ИД на публикация, която трябва да бъде публикувана. Тази колона е FK към таблицата Публикация. Ако ИД на публикация е нула, този запис е активната версия.

Разбрах, че публикацията е много дълга. Следователно, вместо да изброявам подробностите на сценария, реших бързо да обобщя съображенията за дизайна в мисловна карта. Съображения за дизайн на моментна снимка

Сега има 2 решения, към които клоним - и двете ще съхраняват моментна снимка на всички данни, независимо дали са се променили или не. Поддържането само на делта при запазване на структурите на таблицата непокътнати би наложило много сложна съхранена процедура, която трябва да се изпълнява при всяко вмъкване/актуализация на който и да е от заснетите обекти. Не искам да тръгвам по този път, тъй като това ще отнеме повече време, а обемите така или иначе не са толкова големи.

Решение 1: Всеки път, когато се публикува обект (като предложение или бюджет), ние ще попълним XML дърво и ще го запазим в базата данни. Само най-новата версия трябва да е налична в уебсайта, а старите версии рядко са необходими. Като се има предвид това, ще се сблъскам ли с голям проблем с производителността поради използването на XML? Използваме SQL Server. Обемите на данните не са големи.

Решение 2: Всички таблици на транзакции ще имат ИД на публикация и референтните данни ще имат начална и крайна дата. Всеки път, когато бъде публикуван обект, бихме направили копие на всички записи на транзакции и бихме поставили идентификатора на публикацията там и бихме копирали всички записи с референтни данни и бихме поставили дата на моментна снимка като крайна дата. Това ще ни позволи да имаме нормални версии за референтни данни извън процеса на публикуване.

Ще имам нужда от мнения от опитни умове тук относно недостатъците на тези 2 подхода и дали има друг по-добър сценарий.


person Siraj Samsudeen    schedule 22.03.2011    source източник
comment
Чудя се дали сте разглеждали времеви бази данни.   -  person Angelom    schedule 04.04.2011
comment
Някои въпроси: Вашето хранилище на данни има ли измерения, базирани на време/календар? Изискване ли е вашите моментни снимки да се съхраняват в същата таблица като оригиналните данни?   -  person Chris Walton    schedule 13.04.2011
comment
Здравей Крис, да, DW схемата (която е отделна от схемата, която проектираме за транзакционна DB) има времево измерение. Няма изискване да го съхраняваме в една и съща таблица - можем да вземем решение въз основа на това, което работи най-добре.   -  person Siraj Samsudeen    schedule 13.04.2011
comment
Здравей Ангелом, разгледах накратко временните бази данни. Изглеждаше като научна тема с много изследвания. Прегледах връзките от публикацията в stackoverflow, свързана с временни бази данни.   -  person Siraj Samsudeen    schedule 13.04.2011


Отговори (1)


Моят подход би бил да избера решение 2. Вземайки вашите съображения за дизайн в ред:

  1. Бих съхранил копие на всичко в моментната снимка. Ако съхранявате само промяната, вие си създавате проблема да направите моментна снимка на детайлите на процеса, за да получите желаната моментна снимка от промените. Първоначално това не е проблем, но тъй като схемите, програмите и процесите се променят, ще трябва да поддържате подробности за това как да извлечете желаната моментна снимка от процес, който сам по себе си е променен. Изпълнимо, но потенциално крехко.

  2. Бих избрал опция, която не е спомената във вашата диаграма, макар и скицирана във вашето описание на решение 2. Това използва схема, много подобна на тази на транзакционната база данни, но разширена, за да включва информацията, специфична за моментните снимки. Споменавате ID на публикация като външен ключ и дати за референтните данни. Може да откриете, че се нуждаете от допълнителна информация като дати, свързани с данните за транзакцията.

  3. Същата схема няма да свърши работа - вие сте посочили (ИД на публикация), че същата схема не е подходяща. Нищо в това, което публикувате, не предполага, че трябва да приемете различна схема, оптимизирана за четене. Дори ако това се окаже необходимо, това е нещо, което може да бъде включено на по-късен етап, с настоящата разширена схема като отправна точка. Нямам много опит с XML дървета, но бих попитал "защо да въвеждам друга технология, когато имате алтернативи, които могат да използват вашата съществуваща инфраструктура?" Всяко предимство, което възприемате от този подход, трябва да е много значително, за да не се откажете от предимството на ливъриджа от вашата съществуваща архитектура. Подобни съображения се отнасят за денормализирана база данни. Защо да ходите там, докато няма демонстрирана нужда от това?

  4. Отново бих възприел подхода за проследяване на версии и моментни снимки. Вие давате основна полза от този подход във вашето решение 2. Бих добавил моментна снимка на референтните данни като част от процеса на моментна снимка, а не процеса на създаване на версии. (Т.е. когато се прави моментна снимка, уверете се, че съответните референтни таблици са част от моментната снимка). Изглежда от вашето описание, че имате две различни изисквания, които случайно използват едни и същи данни - моментна снимка и версия. Изглежда, че има малка зависимост между тях и затова трябва да ги поддържате възможно най-независими - липса на връзка.

  5. Вие споменавате потенциално използване на хранилището на данни като хранилище, въпреки че не е изрично споменато във вашите решения. Ако вашите обеми са, както предполагате, ниски, тогава бих помислил, че отделна база данни е подходяща. Вие създавате впечатлението, че обемите на данни и потребители за моментните снимки са ниски, така че няма да изглежда първи случай за използване на хранилището на данни. В същото време складът разполага с механизми за съхранение на точно този тип исторически данни, които да се използват за четене и анализ.

Съжалявам, че не отговорих директно на въпросите ви тук - но се надявам, че това дава някои насоки и друг поглед върху заявената от вас ситуация.

person Chris Walton    schedule 13.04.2011
comment
Първо, благодаря много за много обмислените насоки. Определено много полезно и вашите усилия наистина се оценяват. Съгласен съм с вас, точка №1 - брилянтна точка относно промените в процеса, които не съм предвидил. Реших да направя моментна снимка, използвайки същата схема, но добавяйки само идентификационния номер на моментната снимка и заснемайки елементи, свързани с моментната снимка в таблицата за моментна снимка (моят подход 2). Така че засега нямам нужда да заснема допълнителни подробности, специфични за всяка таблица в моментната снимка. - person Siraj Samsudeen; 19.04.2011
comment
Виждам също прозрението на точка 4 - да, има много малка зависимост между версиите на референтните данни и моментната снимка на референтните данни. Така че реших да ги направя отделно. Взех решенията, за които намекнахте по-рано - получаването на отговор от някой, който потвърждава решенията ми, ми осигурява допълнително удобство. Благодаря много отново Крис за отделеното време. - person Siraj Samsudeen; 19.04.2011