Вы можете использовать 2 простых цикла, как это:
my_dict = {'abc':{'a':0.987, 'b':0.765, 'c': numpy.nan}, 'mda':{'a':0.145, 'b':0.584, 'e':numpy.nan}, 'fop':{'a':0.145, 'b': numpy.nan, 'c':0.485}}
for items in my_dict:
get_key = my_dict[items]
for key, values in get_key.copy().items():
if numpy.isnan(values):
del get_key[key]
my_dict
> {'abc': {'a': 0.987, 'b': 0.765},
'mda': {'a': 0.145, 'b': 0.584},
'fop': {'a': 0.145, 'c': 0.485}}
Я составил бы две таблицы: один для вида IsLast значений и один для исторических. Затем я установил бы триггер, который вставляет значение в историческую таблицу каждый раз, когда isLast обновляется.
Если бы у меня есть 1 или 2 таблицы истории для хранения, я сделал бы это точно, как Tuinstoel предположил. Но если бы у Вас были десятки таблиц, чтобы сделать это на, то я переместился бы больше к решению, описанному zendar. Причина - это.
Как Вы отвечаете на вопросы как,
Что изменилось с тех пор вчера, когда все было прекрасно?
Есть у пользователя SMITHG, внес какие-либо изменения?
Те вопросы требуют одного запроса на таблицу, является ли это отдельной _hist таблицей или разделом в таблице. Неважно, это - некоторый огромный список запросов. Если у Вас есть центральная таблица, которая похожа на это, то это - часть круга.
table_name, Column_name, PK, Before_value, After_value, User, timestamp
Вставляет имеют только после значений,
Удаляет имеют только перед значениями,
Обновление имеет обоих, но только для столбцов, которые изменились.
Некоторые изменения
Можно включать столбец для I/U/D, если Вы предпочитаете, чтобы можно было исключить значения столбцов для Вставок и просто записать PK и меня, так как правильные значения находятся все еще в таблице.
Так как это - Oracle, которую Вы могли разделить на table_name, так в сущности у Вас на самом деле есть тот тсс "таблицей" на реальную таблицу.
Можно легко ответить на вышеупомянутые вопросы, которым я верю, вполне просто, чаще всего заданные вопросы. И это обрабатывает каждый вопрос, на который можно ответить с разделами или _hist таблицами.
Так как Вы используете Oracle, Вы могли проверить Технологию Oracle Flashback. Это записывает изменения всех изменений в базе данных, и данные и структура. Это также записывает метку времени и имя пользователя.
Я не использовал его, но это выглядит способным.
Первый вопрос должен быть: что Вы сделали бы с теми данными? Если у Вас нет ясного бизнес-требования, не делайте этого.
Я сделал что-то подобное и после 3 лет выполнения существует приблизительно 20% "допустимых данных", и отдых является "предыдущими версиями". И это - 10 миллионов + 40 миллионов записей. За прошлые три года у нас было 2 (два) запроса для исследования истории изменений, и запросы обоих раз были глупы - мы записываем штамп времени рекордного изменения, и нас попросили проверить, работали ли люди сверхурочно (после 17:00).
Теперь, мы застреваем с базой данных увеличенного размера, которая содержит 80% данных, в которых никто не нуждается.
Править:
Так как Вы попросили возможные решения, я опишу то, что мы сделали. Это несколько отличается, чем решение, которое Вы рассматриваете.
Мы записываем все изменения в единственной архивной таблице со следующими столбцами:
Вещь прокладывает себе путь:
Pro:
Недостатки:
LIKE
оператор на строке.Так, снова, проверьте требования к архиву. Это не тривиальная задача, но получает, и использование может быть минимальным.
Основное ограничение, которое происходит по моему мнению, - то, что существенная часть Вашей таблицы будет ретроспективными данными, что означает индексировать проблемы и потенциально вводить дополнительную сложность в Ваши запросы CRUD.
Есть ли некоторая конкретная причина, Вы не хотите использовать то, что, кажется, обычное решение этой ситуации?
Как Вы определите первичные ключи? Будет много строк с тем же первичным ключом из-за хранения строк истории в той же таблице.
Также у Вас, кажется, нет способа знать порядок Ваших строк истории, когда единственная "реальная" строка изменяется больше однажды.
(Один проект, я продолжил работать, мы генерировали все таблицы истории и триггеры с помощью codesmith, это работало очень хорошо.)
Я использовал бы IS_LAST=1
раздел, и IS_LAST=0
система раздела. Поскольку это делится, это будет быстро (сокращение раздела), и Вы никогда не должны будете запрашивать объединение нормальной таблицы и таблицы истории.
Я использовал бы IS_LAST ='Y'/'N' и не 1/0. 1 и 0 бессмысленны.
Существует специальный прием, который может помочь гарантировать, что там макс. одна строка с IS_LAST='Y'
на объект: можно создать уникальный основанный на функции индекс с функцией, которая возвращает пустой указатель когда IS_LAST='N'
и возвратите идентификатор когда IS_LAST='Y'
. Это объяснено здесь: http://www.akadia.com/services/ora_function_based_index_1.html
Был бы, отслеживая его на основе справки времени Вы достигнуть эффекта, который Вы ищете ежедневно и в конце бизнеса или в середину ночи в зависимости от самого низкого времени объема сделки при выполнении процедуры для перемещения запаздывания данных в таблицу истории затем, это помогло бы?? тем путем все Ваши обновления были бы вставками, и никакая блокировка не требуется также. С уважением, Andy
Все зависит от того, что у вас есть:
Как и в других случаях, я использую ORM (Propel) с базовым объектом, содержащим настраиваемые методы сохранения и удаления . Эти методы отменяют стандартные операции сохранения и удаления, которые поставляются с ORM. Они проверяют, какие столбцы были изменены, и создают 1 строку в таблице изменений для каждого измененного столбца.
Схема для таблицы изменений
:
change_pk, user_fk, user_name, session_id, ip_address, method, table_name, row_fk, field_name, field_value, most_recent, date_time
Пример: 1, 4232, 'Gnarls Barkley', 'f2ff3f8822ff23', '234.432.324.694', 'UPDATE', 'User', 4232, 'first_name', 'Gnarles', 'Y', '2009-08-20 10:10 : 10 ';