Отслеживать изменения в базе данных или дифференцировать записи по меткам времени?

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

Мой вопрос касается небольшой базы данных SQL с 10 таблицами, <10 столбцов каждая, с использованием объединений для создания "главной" соединительной таблицы: есть ли недостаток в обновлении несколько раз в год путем добавления строк (с большим количеством дублирующейся информации) а затем взяв MAX id (PK), чтобы сгенерировать и опубликовать на веб-сайте самые последние данные в табличной форме (взятые из "основного")? Это против обновления записей, в которых я потеряю информацию о значениях в определенный момент.

Типичная строка для контактной информации учителя: fName, lName, schoolName, [адрес и телефон]; для репертуара или информации о прослушивании: год, инструмент, пьеса, композитор, издатель / издание.

Другие спрашивали об отслеживании изменений в БД, но только один раз, и не так много голосов / деталей: Как отслеживать изменения данных в таблице базы данных. Ведение истории изменений данных - лучшая практика? Как отслеживать изменения данных в таблице базы данных

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

больше информации, если необходимо: я учитель музыки (то есть программист-любитель), поддерживающий веб-сайт Joomla для нашей организации. Я использую плагин Joomla под названием Sourcerer для создания динамического контента (PHP/SQL для базы данных Joomla), чтобы упростить передачу изменений (даты, персонал, правила, репертуар и т. Д.). В течение многих лет это делалось со статическими страницами. (и бумажные справочники), на обновление которых уходили дни.

Я также, однако, хочу иметь возможность оглянуться назад и увидеть состояние базы данных в конкретное время: кто преподавал, где, какой фрагмент прослушивания был указан и т. Д., Как мы могли бы с бумажными версиями. ПРИМЕЧАНИЕ: я не отслеживаю изменения HTML, только ту информацию, которая подается из базы данных.

Спасибо за любую помощь! (Я следовал ТАК в течение многих лет, но это мой первый вопрос.)

Код, который я сейчас использую для генерации "главной таблицы соединений". Я изменил бы это на "INSERT в" для моих новых строк и запросил бы его через Sourcerer, чтобы разместить информацию в Интернете.

CREATE TABLE 011people_to_schools_junction 
AS (
   SELECT * 
   FROM (
       SELECT a.peopleID, a.districtID, a.firstName, a.lastName, a.statusID, c.schoolName 
       FROM 01People a 
       INNER JOIN ( 
           SELECT districtID, MAX(peopleID) peopleID 
           FROM 01People 
           GROUP BY districtID 
            ) b 
       ON a.districtID = b.districtID 
       AND a.peopleID = b.peopleID 

       INNER JOIN (
           SELECT schoolID, MAX(peopleID) peopleID
           FROM 01people_to_schools_junction ab
           GROUP BY schoolID
           ) z
        ON z.peopleID = a.peopleID 

        LEFT JOIN 01Schools c 
        ON c.schoolID = z.schoolID 
        WHERE z.schoolID IS NOT NULL
        OR z.peopleID IS NOT NULL
        ORDER BY c.schoolName
    ) t1 
);

#Add a primary key as the first column
ALTER TABLE 011people_to_schools_junction
ADD COLUMN 011people_to_schoolsID INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (011people_to_schoolsID);

1 ответ

Решение

Чтобы ответить на ваши вопросы по порядку:

Есть ли обратная сторона?

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

Где предложения в связанном вопросе плохие или просто не популярные?

Вопрос и ответы хороши; но правильный ответ зависит от вашего конкретного случая использования: вы делаете это по юридическим причинам, как быстро вы хотите иметь доступ к данным, сколько данных и обновлений у вас есть, сколько вы хотите, чтобы ваша функциональность истории сохранялась без изменений... только если бы он соответствовал вашему варианту использования, вы бы проголосовали.

Как правило, история должна идти в другую таблицу, это обеспечит несколько преимуществ:

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

Чтобы выбрать, иметь ли одну таблицу истории или несколько (по одной на резервную копию таблицы), зависит от того, как вы планируете получать данные и что вы хотите с ними делать:

  • если вы отразите в каждой из ваших таблиц добавление метки времени и идентификатора пользователя, ваш код потребует небольших изменений; но в итоге вы получите вдвое больше таблиц, и любое изменение структуры потребуется затем скопировать и на таблицу истории;

  • если вы создадите единственную таблицу истории с отметкой времени, идентификатором пользователя, именем таблицы и представлением записи в формате json, вам будет проще построить ее, а для ее извлечения вам необходимо получить доступ к данным, используя объект на строку, т.е. используя dbo getObjectList () Joomla, тогда объекты будут в том же формате, который вы храните в таблице истории, и изменения будут довольно простыми. Но запрос изменений для определенных таблиц / полей будет намного сложнее.

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


Поскольку вы упоминаете о переходе на веб-сайт несколько раз в год, накладные расходы на запросы не должны вызывать проблем (если вы обновляете ежемесячно, ожидание в течение 5 минут может не быть проблемой).

Вам следует искать лучшее решение, основанное на других способах использования этих данных: для того, чтобы оно было полезным для всех, вам придется внедрить систему для извлечения исторических данных. Если phpmyadmin достаточно, хорошо смотреть не дальше.


Я надеюсь, что это напугало вас. В любом случае это тяжелая работа.

Если вы просто хотите иметь возможность искать старые данные, вы можете вместо этого сохранить копию разметки / вывода, которую вы время от времени генерируете, и сохранять ее в разных папках на веб-сервере. Это займет несколько минут, чтобы быть очень надежным.
Конечно, это забавнее, чтобы кодировать это. Но вы действительно уверены, что это нужно? И вы можете сохранить дамп базы данных на тот случай, если однажды вы передумали.

Другие вопросы по тегам