2015-04-16 2 views
1

качестве партнера, где я работаю создали таблицу клиентов со следующими полями:Противоречивые данные в таблице

first_name, middle_name, last_name, second_last_name, full_name

Где full_name является конкатенация других полей.

Можете ли вы дать мне лучшее объяснение, почему плохая практика?

+0

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

ответ

2

Это не идеально, потому что рано или поздно кто-то или что-то собирается обновить last_name или first_name без обновления full_name, или наоборот, и вы будете иметь что-то подобное в вашей базе данных:

first_name last_name full_name 
John   White  John Black 

И то вы можете попытаться выяснить, откуда происходит несоответствие, и о том, что на самом деле должна быть фамилия этого парня, и это не забавно. Если вы собираетесь в denormalize такой таблице, для этого должна быть какая-то веская причина. Какова причина вашего партнера в том, что вы хотите, чтобы full_name было отдельным полем?

Вероятно, вам следует исследовать альтернативы. Например, вы можете определить view, который возвращает различные компоненты имени из вашей таблицы, а также собирает их в full_name. В зависимости от вашей РСУБД у вас могут быть и другие варианты. Например, в SQL Server вы можете поместить computed column прямо в вашу таблицу.

declare @customer table (first_name varchar(50), last_name varchar(50), full_name as first_name + ' ' + last_name); 
insert @customer values ('John', 'B'); 
select * from @customer; 

Результат:

first_name last_name full_name 
John   B   John B 
0

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

Если столбец full_name фактически является функцией (например, он рассчитан из других элементов в этой строке), решение в порядке!

В зависимости от механизма базы данных вы используете эти расчетные столбцы, которые могут быть прочитаны (вам нужно обновить другие столбцы, чтобы изменить их результат), или даже быть read-write. Запись в такой столбец обрабатывается другой функцией, которая, например, может анализировать полное имя и хранить детали в строке, которая должна быть обновлена.

Смежные вопросы