Моят избор би бил вариант на подход 2. Удебелен шрифт показва полета в първичния ключ.
- Вмъквате всяка статия в таблица
articles_versioned
(id , клеймо за време , име, текст) - Втората ви таблица е
articles
(id , времева марка, [име, текст]). Обърнете внимание как времевата марка не е основна; името и текстът могат да бъдат репликирани или можете да използвате присъединяване сarticles_versioned
(което ще бъде бързо, тъй като id и timestamp саarticles_versioned
първичен ключ) articles_versioned
има тригер при вмъкване, който приема току-що вмъкнатия ред и го репликира вarticles
- За да възстановите конкретна версия на статия, променяте
articles
маса.
Предимствата на този подход са:
- Получавате безплатно друга информация (дата и час на статията) във вашата таблица, която така или иначе може да ви е необходима
- Не е нужно да правите заявки в базата данни, за да получите текущата дата. Ако използвате версия, трябва.
- Вашият код не трябва да вмъква статията в две таблици. Просто вмъквате в
articles_versioned
и прочетете отarticles
, db се грижи за мигрирането на данни, докато ги вмъквате чрез тригера, избягвайки всякакви проблеми с последователността.
Недостатъци
- В силно едновременна среда две версии могат да бъдат вмъкнати едновременно, така че една от тях може да се провали. Това не би трябвало да е проблем при вмъкване на статии, написани от потребителя (много малко вероятно е, като се има предвид точността на времевите марки в наши дни). Ако не посочите клеймото за дата във вашия
INSERT
изявление, но вместо това зададете полето datetime да има текущото време като стойност по подразбиране, може да избегнете този проблем изцяло.
За да отговоря на останалия въпрос. Подход 1 няма да доведе до по-дълги заявки, стига да добавите индекс към състоянието. Това има смисъл само ако сте склонни да имате много различни версии на всяка статия; стига да имате средно по 2 версии на статия или по-малко, индексът само ще ви забави, а подход 2 така или иначе няма да бъде разумно по-бърз (въпреки че все пак бих препоръчал моя подход, защото опростява кода, тъй като възстановяването на версия прави не изисква статус на превключване за два реда).
Свързаните ресурси, като изображенията, трябва да следват подобна версия. Предполагам, че ги записвате във файловата система; вместо да ги запазвате с истинското им име, използвайте таблица (id , image_name), за да дадете на всяко изображение идентификатор, след което запишете изображението като -id-.jpg
. Полето image_name ще ви позволи да разберете какво е било оригиналното име на файла (ако ви е грижа за това). По този начин можете да версиите изображенията по същия начин, както версиите на статии, а в статиите ще използвате нещо като <img src="-id-.jpg">
, за който знаете, че ще остане достъпен завинаги.