Если массив прост, и порядок имеет значение, поэтому две строки могут помочь
//Assume
var a = ['a','b', 'c']; var b = ['a','e', 'c'];
if(a.length !== b.length) return false;
return !a.reduce(
function(prev,next,idx, arr){ return prev || next != b[idx] },false
);
Уменьшить количество проходов по одному из массивов и возвращает «false», если хотя бы один элемент «a» равен ни равно элементу 'b' Просто оберните это в функцию
Думайте тщательно о требованиях для изменений. Как только Вашей кодовой базе встроили распространяющуюся историю, отслеживающую в операционную систему, это станет очень сложным. Страховка подписание системы особенно плохи для этого со схемами, часто работающими сверх 1 000 таблиц. Запросы также имеют тенденцию быть довольно сложными, и это может привести к проблемам производительности.
, Если историческое состояние действительно только требуется для создания отчетов, рассмотрите реализацию системы обработки транзакций 'текущего состояния' со структурой хранилища данных, зависающей от спины для отслеживания истории. Медленно Изменяющиеся Размеры являются намного более простой структурой для отслеживания исторического состояния, чем попытка встроить специальную историю, отслеживающую механизм непосредственно в Вашу операционную систему.
кроме того, Измененный Сбор данных более прост для системы 'текущего состояния' с изменениями, сделанными к записям на месте - первичные ключи записей не изменяются так, Вы не должны соответствовать записям, скрепляющим различные версии того же объекта. Эффективный механизм CDC заставит возрастающий склад загрузить процесс, довольно легкий и возможный работать вполне часто. Если Вам не требуется up-to-the минуту, отслеживая исторического состояния (почти, но не совсем, и оксюморон), это может быть эффективным решением с намного более простой кодовой базой, чем полная история, отслеживающая механизм, созданный непосредственно в приложение.
Альтернатива строгому управлению версиями должна разделить данные на 2 таблицы: ток и история.
текущая таблица имеет все живые данные и обладает преимуществами всей производительности, в которой Вы создаете. Любые изменения сначала пишут текущие данные в связанную таблицу "истории" наряду с маркером даты, который говорит, когда это изменилось.
Техника, которую я использовал для этого в том прошлом, должна была иметь понятие "поколений" в базе данных, каждое изменение увеличивает текущее число поколения для базы данных - при использовании подрывной деятельности думайте изменения. Каждая запись имеет 2 числа поколения, связанные с ним (2 дополнительных столбца на таблицах) - поколение, что запись начинает быть допустимой для, и поколение, для которого это прекращает быть допустимым. Если бы данные в настоящее время допустимы, второе число было бы ПУСТЫМ или некоторый другой универсальный маркер.
Так для вставки в базу данных:
, Если Вы обновляете некоторые данные:
, просто вопрос маркировки данных как завершающийся в текущем поколении.
Для получения конкретной версии данных найдите, какое поколение Вы после и ищете данные, допустимые между теми версиями поколения.
Пример:
Создают человека.
|Name|D.O.B |Telephone|From|To |
|Fred|1 april|555-29384|1 |NULL|
Обновление номер телефона
|Name|D.O.B |Telephone|From|To |
|Fred|1 april|555-29384|1 |1 |
|Fred|1 april|555-43534|2 |NULL|
Удаляют fred:
|Name|D.O.B |Telephone|From|To |
|Fred|1 april|555-29384|1 |1 |
|Fred|1 april|555-43534|2 |2 |
Простой надежный путь, состоит в том, чтобы добавить столбец версии к Вашим таблицам и сохранить версию Объекта и выбрать соответствующую прикладную логику на основе того номера версии. Таким образом, Вы также получаете назад совместимость для небольшой стоимости. Который всегда является хорош
Вам будет нужна основная запись в основной таблице, которая содержит информацию, распространенную среди всех версий.
Тогда каждая дочерняя таблица использует основной рекордный идентификатор + версия не как часть первичного ключа.
Это может быть сделано без основной таблицы, но по моему опыту это будет иметь тенденцию делать SQL-операторы намного более грязными.
ZoDB + ZEO реализует основанную на пересмотре базу данных с полным откатом к любой поддержке момента времени. Пойдите проверяют его.
Плохая Часть: это - связанный Zope.
Если вы используете Hibernate, JBoss Envers может быть вариантом. Вам нужно только аннотировать классы с @Audited
, чтобы сохранить их историю.