|
Программирование >> Исключение дубликатов строк
Для того чтобы узнать, имеется ли составное поле, ответьте на совсем простой вопрос: Можно ли взять текущее значение этого поля и разделить его на несколько более мелких частей? Если ответом будет Да , то это составное поле. Рис. 2.2 показывает плохо спроектированную таблицу с несколькими составными полями. В этой таблице три составных поля: CustomerName, StreetAddress и Phone-Number. Видно, что каждое поле можно разбить на несколько меньших полей. Например, CustomerName можно разделить на два отдельных поля: CustFirstName и CustLastName (мы использовали соглашение о присвоении имен и добавили префикс Cust к полям FirstName и LastName). Когда в таблице обнаруживается составное поле, определите, из скольких частей состоит значение, которое в нем сохраняется, а затем разделите поле на несколько более мелких полей, в зависимости от обстоятельств. На рис. 2.3 показано, как разделить многозначное поле в таблице Customers. Customers
Рис. 2.3. Дробление составных полей таблицы Customers Внимание! Вместе с разбиением StreetAddress хорошо было бы разделить PhoneNumber на два отдельных поля. К сожалению, из-за отсутствия места невозможно продемонстрировать это на рис. 2.3. Иногда затруднительно распознать составное поле. Взгляните на таблицу Instruments, представленную на рис. 2.4. На первый взгляд кажется, что в ней отсутствуют какие-либо составные поля. Но при более тщательном рассмотрении вы увидите, что InstrumentID на самом деле является составным полем. Значение, сохраненное в этом поле, представляет две отдельные части информации: категорию, к которой принадлежит инструмент, например AMP (усилитель), QUIT (гитара) и MFX (синтезатор), и его идентификационные номера. Эти два значения необходимо разделить и сохранить в своих собственных полях, чтобы гарантировать целостность данных. Представьте себе трудности корректировки этого поля, если категория MFX изменяется на MFU. Потребуется написать программу для грамматического разбора значения в этом поле и для проверки существования MFX, а затем для замены его на MFU, если он имеется в пределах синтаксически проанализированного значения. Instruments
Рис. 2.4. Пример неявного составного поля Вы, конечно, сможете сделать эту работу, но определенно затратите больше усилий, чем необходимо, и ее совсем не придется выполнять, если база данных спроектирована надлежащим образом. Если имеются такие поля, как приведенное в примере, разбейте его на меньшие поля, чтобы это были надежные, эффективные структуры. Дробление многозначных полей Дробление многозначных полей является совсем несложным, но разбиение многозначных полей окажется немного более трудным и потребует некоторой работы. К счастью, вы узнаете многозначное поле, когда увидите его. Почти без исключения данные, сохраненные в поле этого типа, содержат много запятых. Запятые используются для разделения различных значений в пределах самого поля. Пример многозначного поля представлен на рис. 2.5. В данном примере кавдый летчик имеет допуск к пилотированию некоторого количества самолетов. Эти допуски сохраняются в отдельном поле с именем Certifications. Способ сохранения данных в этих полях очень ненадежен, поскольку вы обречены сталкиваться с тем же типом проблем целостности данных, которые характерны для составных полей. При более внимательном рассмотрении данных можно увидеть, что трудно выполнять поиск и сортировку по этому ПОЛЮ в запросе SQL. Прежде чем разделить это поле соответствующим образом, необходимо понять действительные связи между многозначным полем и таблицей, к которой оно изначально относится. Piiots
Рис. 2.5. Пример многозначного поля Значения в многозначном поле обладают соотношением многие-ко-многим с каждой записью в его родительской таблице. Одно конкретное значение многозначного поля может быть связано с любым количеством записей родительской таблицы, а отдельную запись в родительской таблице можно соотнести с любым количеством значений в многозначном поле. На рис. 2.5, например, специальный самолет в поле Certifications может ассоциироваться с любым количеством пилотов, а отдельный пилот может быть соотнесен с любым номером самолета в поле Certifications. Эта связь многие-ко-многим разделяется так же, как и любая другая связь многие-ко-многим в рамках базы данных - с помощью связывающей таблицы. Для создания связывающей таблицы используйте многозначное поле и копию поля первичного ключа из исходной таблицы как основу д.1я новой таблицы. Присвойте новой связывающей таблице соответствующее имя и определите оба поля как составной первичный ключ (в данном случае это комбинация значений обоих полей, которые будут идентифицировать уникальным образом каждую запись в новой таблице). Теперь можно связать значение каждого из полей в связующей таблице на основе один-к-одному. На рис. 2.6 представлен пример этого процесса с использованием таблицы Pilots, показанной на рис. 2.5. Pilots
Pilot Certifications (таблица связей)
Certifications
Рис. 2.6. Разделение многозначного поля с использованием связывающей таблицы
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |