2013-07-09 4 views
0

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

Account, Date, Amount, Particulars/Description/Details/Narration 

Теперь необходимо сохранить уникальность уже загруженных и будущих записей.

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

Как сохранить такую ​​уникальность, которую мы можем идентифицировать транзакции из файла, уже загружен. Все предложения приветствуются.

Edit 1

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

Edit 2

Существующие записи могут иметь повторяющиеся записи на основе данных 4 полей, то же самое значение для Счета, даты, суммы и сведений для двух или более действительных транзакций, но они уверены, что эти записи являются val id даже с повторяющимися значениями.

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

Редактировать 3

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

ответ

1

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

My other response обращается к фактической ситуации ОП.


Похоже, вам нужен сложный уникальный ключ:

alter table your_table add constraint your_table_uk 
    unique (Account, Date, Amount, Particulars) 
    using index 

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

Или, возможно, поскольку @ypercube предлагает только (Account, Date, Particulars).

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

Вы говорите, что загруженные записи имеют проверенную достоверность, но если это не так, измените оператор ALTER TABLE, чтобы использовать предложение EXCEPTIONS INTO, чтобы найти дублированные строки. У вас будет специальная таблица, чтобы зафиксировать нарушения ограничений. Find out more.

+0

или, возможно, 3 колонки - без «суммы». –

+0

Невозможно, так как я заявил, что эти столбцы можно просто дублировать для двух или более действительных транзакций – bjan

+0

@ypercube - возможно. Но не видя данных, которые могут сказать? – APC

1

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

Но как может кто-нибудь сказать, если в загруженных данных или исходных файлах нет знака уникальности? Что означает справедливость?

«Теперь для загрузки отсутствуют записи, мы должны определить, если запись уже загружен или нет, так что мы не нагружают запись, которая уже загружен.»

Без существующего источника уникальности вы не сможете это сделать. Поскольку у вас есть две строки для данной комбинации (Account, Date, Amount, Particulars), и все в порядке, каковы правила определения того, что третий экземпляр (Account, Date, Amount, Particulars) - это запись, которая уже была загружена, следовательно, недействительна или запись, которая не была загружена, следовательно, действительна.

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

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


"это мой долг, чтобы найти решение"

Нет, это не ваша обязанность. В настоящее время долг лежит на плечах владельца данных, чтобы точно определить их данные, и это включает определение бизнес-ключа. Это те, кто отменил свои обязанности.

В этих условиях у вас есть три варианта:

  1. отказывается загружать какие-либо дополнительные записи, пока владелец данных не делает свой долг.
  2. Загрузите все записи, представленные вам для загрузки без какой-либо проверки.
  3. Используйте синтаксис ужасного NOVALIDATE.

NOVALIDATE - это способ обеспечения соблюдения правил валидации для будущих строк, но игнорирование нарушений в существующих данных. В основном это технический клочок для политической проблемы.

SQL> select * from t23 
    /

     COL1 COL2 
---------- -------------------- 
     1 MR KNOX 
     1 MR KNOX 
     2 FOX IN SOCKS 
     2 FOX IN SOCKS 


SQL> create index t23_idx on t23(col1,col2) 
    /

Index created. 

SQL> alter table t23 add constraint t23_uk 
      unique (col1,col2) novalidate 
    /

Table altered. 

SQL> insert into t23 values (2, 'FOX IN SOCKS') 
    /

insert into t23 values (2, 'FOX IN SOCKS') 
* 
ERROR at line 1: 
ORA-00001: unique constraint (APC.T23_UK) violated 

SQL> 

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

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

Этот подход полностью игнорирует понятие «действительность». Поэтому он отклонит записи, которые, возможно, должны были быть загружены, поскольку они представляют «действительное» n-е вхождение (Account, Date, Amount, Particulars). Это неизбежно. Хорошей новостью является то, что никто не сможет сказать, потому что не существует определенных правил для установления действительности.

Какой бы вариант вы ни выбрали, важно, чтобы вы четко объяснили это своему боссу, владельцу данных, боссу владельца данных и тому, кому вы считаете нужным, и получите их письменное согласие. В противном случае, в какой-то момент люди обнаружат, что база данных заполнена повторяющимися строками, или кто-то будет жаловаться на то, что «действительная» запись не была загружена, и все это будет вашей ошибкой ... если у вас нет подписанного фрагмента бумага с разрешением от соответствующей верхней латуни.

Успехов


Haki's suggestion of using MERGE имеет тот же эффект, как NOVALIDATE, потому что она будет загружать новые записи и подавить все дубликаты. Тем не менее, это еще больше излома: он вообще не затрагивает понятие уникальности. Любой, у кого есть доступ INSERT или UPDATE, все равно сможет иметь любые строки, которые им нравятся. Таким образом, этот подход будет работать, только если вы сможете полностью заблокировать привилегии в этой таблице, чтобы его данные могли обрабатываться только через MERGE и ни один другой DML. Зависит ли постоянная уникальность. Опять же, бизнес-решение.

+0

«Идите к людям, которые утвердили действительность загруженных записей», вы правы до сих пор :), но мой долг - найти решение :( – bjan

+0

+1 для помощи – bjan

0

звучит как вам нужно upsert - или как оракул называет его MERGE

MERGE операция между двумя таблицами позволяет обрабатывать две общие ситуации -

  1. Запись уже существует в целевой таблице и мне нужно сделать что-то с ним - либо обновить, либо ничего не делать.

  2. Запись не существует в целевой таблице - вставьте ее.