2013-06-24 4 views
3

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

create table visits (id int, values varchar(100))  

INSERT INTO visits values (1, '01/01/2000, 1') 
INSERT INTO visits values (2, '01/01/2000, 2') 
INSERT INTO visits values (3, '01/01/2000, 3') 

В строке 1 указано, что на 01/01/2000 клиент 1 посетил магазин. Строка 2 говорит, что на 01/01/2000 клиент 2 посетил магазин и т. Д.

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

create table visits (id int, visitdate datetime, customerid int) 

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

+2

Добавить новые столбцы для даты и customerid в таблицу посещений. Перемещаясь вперед, начните вставлять в новые столбцы, продолжая вставлять предыдущий столбец. Затем вы можете добавить функцию, которая будет использовать новые столбцы. – Matt

+1

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

+1

Очевидно, что вам понадобится эта книга: http: // www. amazon.com/Refactoring-Databases-Evolutionary-Addison-Wesley-ebook/dp/B001QAP36E/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1372109272&sr=1-1&keywords=refactoring+databases – HLGEM

ответ

3

Вы можете создать SQL View с Insert, Update и Delete триггерами. Оператор Select views объединяет рефакторированную таблицу, чтобы предоставить один столбец «values». Реорганизованная таблица может быть правильно нормализована с помощью столбцов с атомной оценкой.

В представлениях Вставка и обновление есть функция для преобразования старого столбца одиночных значений в отдельных столбцов. Удалить вид удаляет строку базового базового стола.

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

С рефакторированными таблицами, имеющими атомнозначные столбцы, вы можете создавать более избирательные индексы. Их можно использовать для ускорения некоторых ключевых запросов.

+0

Спасибо. Это означает, что информация будет храниться в двух местах? – w0051977

+0

Нет, данные хранятся только в одном месте. Это находится в столбцах refactored table. В представлении нет данных. Когда запрос запрашивается через оператор Select, данные объединяются в один столбец во время выполнения SQL с использованием хранимой процедуры. Таким образом, данные для представления материализуются только во время транзакции SQL. –

2

Добавить новые столбцы для даты и int, сохранить старый столбец строки, но изменить обновление и вставить код для поддержки новых столбцов.

Затем вам необходимо реорганизовать все код вставки/обновления, чтобы включить новые столбцы.

Для поддержки устаревшего кода «Сплит»: Если вы используете SQL 2005 или более позднюю версию, вы можете заменить столбец «Значения» на «Вычисленный столбец». Если нет, вы можете создать представление с дополнительным столбцом «Значения» и удалить «значения» из реальной таблицы.

Computed Columns

+0

+1 для ссылки на вычисленные поля , Благодарю. Вы бы это сделали? – w0051977

+0

лично нет. Я работаю с Oracle и MS-SQL на данный момент, и это немного специфично, поэтому я либо подойду для просмотра любого старого кода, либо загружу строки в простые классы. Затем вставьте в них функцию split.После того, как все ссылки будут завернуты в классы с некоторыми тестами - я бы реорганизовал разделенные вещи –

+0

Зачем это делать? Дублирование данных в строке путем добавления новых столбцов требует устранения неполадок. Все приложения должны поддерживать данные в двух столбцах для обеспечения совместимости и целостности. –