Mysql
 sql >> база данни >  >> RDS >> Mysql

Най-добра практика за система за версия на mysql данни

Моят избор би бил вариант на подход 2. Удебелен шрифт показва полета в първичния ключ.

  • Вмъквате всяка статия в таблица articles_versioned (id , клеймо за време , име, текст)
  • Втората ви таблица е articles (id , времева марка, [име, текст]). Обърнете внимание как времевата марка не е основна; името и текстът могат да бъдат репликирани или можете да използвате присъединяване с articles_versioned (което ще бъде бързо, тъй като id и timestamp са articles_versioned първичен ключ)
  • articles_versioned има тригер при вмъкване, който приема току-що вмъкнатия ред и го репликира в articles
  • За да възстановите конкретна версия на статия, променяте articles маса.

Предимствата на този подход са:

  1. Получавате безплатно друга информация (дата и час на статията) във вашата таблица, която така или иначе може да ви е необходима
  2. Не е нужно да правите заявки в базата данни, за да получите текущата дата. Ако използвате версия, трябва.
  3. Вашият код не трябва да вмъква статията в две таблици. Просто вмъквате в articles_versioned и прочетете от articles , db се грижи за мигрирането на данни, докато ги вмъквате чрез тригера, избягвайки всякакви проблеми с последователността.

Недостатъци

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

За да отговоря на останалия въпрос. Подход 1 няма да доведе до по-дълги заявки, стига да добавите индекс към състоянието. Това има смисъл само ако сте склонни да имате много различни версии на всяка статия; стига да имате средно по 2 версии на статия или по-малко, индексът само ще ви забави, а подход 2 така или иначе няма да бъде разумно по-бърз (въпреки че все пак бих препоръчал моя подход, защото опростява кода, тъй като възстановяването на версия прави не изисква статус на превключване за два реда).

Свързаните ресурси, като изображенията, трябва да следват подобна версия. Предполагам, че ги записвате във файловата система; вместо да ги запазвате с истинското им име, използвайте таблица (id , image_name), за да дадете на всяко изображение идентификатор, след което запишете изображението като -id-.jpg . Полето image_name ще ви позволи да разберете какво е било оригиналното име на файла (ако ви е грижа за това). По този начин можете да версиите изображенията по същия начин, както версиите на статии, а в статиите ще използвате нещо като <img src="-id-.jpg"> , за който знаете, че ще остане достъпен завинаги.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. По-добър начин за изпълнение на множество MySQL команди с помощта на шел скрипт

  2. В PHP/MySQL трябва ли да отворя множество връзки към базата данни или да споделя 1?

  3. Как да добавите клауза where в инструкция за вмъкване на MySQL?

  4. Как да стартирате PHP скрипта в определено време

  5. Изберете стойности, които отговарят на различни условия на различни редове?