Программирование >>  Исключение дубликатов строк 

1 ... 6 7 8 [ 9 ] 10 11 12 ... 152


Для того чтобы узнать, имеется ли составное поле, ответьте на совсем простой вопрос: Можно ли взять текущее значение этого поля и разделить его на несколько более мелких частей? Если ответом будет Да , то это составное поле. Рис. 2.2 показывает плохо спроектированную таблицу с несколькими составными полями.

В этой таблице три составных поля: CustomerName, StreetAddress и Phone-Number. Видно, что каждое поле можно разбить на несколько меньших полей. Например, CustomerName можно разделить на два отдельных поля: CustFirstName и CustLastName (мы использовали соглашение о присвоении имен и добавили префикс Cust к полям FirstName и LastName). Когда в таблице обнаруживается составное поле, определите, из скольких частей состоит значение, которое в нем сохраняется, а затем разделите поле на несколько более мелких полей, в зависимости от обстоятельств. На рис. 2.3 показано, как разделить многозначное поле в таблице Customers.

Customers

CustomerlD

CustFjrstNarrte

CustLaSiName

CustAddress C-JatCitv

1001

Suzaruie

Vie$ca$

15127 NE 24th. #383

Redmond

98052

1002

Thompson

122 spring River Drive

Duvall

98019

1003

Gary

Halimark

Route 2, Box 203B

Auburn

98002

1004

Michael

Davolio

672 Lanfюnf Ave

Houston

77201

1005

Kenneth

Peacock

4110 Old Redmond Rd.

Redmond

98052

1006

John

Viescas

15127 NE 24th. #383

Redmond

98052

1007

Laura

Callahan

901 Pine Avenue

Portland

97208

1008

Neil

Patterson

233 West Valley Hwy

San Diego

92199

Рис. 2.3. Дробление составных полей таблицы Customers

Внимание! Вместе с разбиением StreetAddress хорошо было бы разделить PhoneNumber на два отдельных поля. К сожалению, из-за отсутствия места невозможно продемонстрировать это на рис. 2.3.

Иногда затруднительно распознать составное поле. Взгляните на таблицу Instruments, представленную на рис. 2.4. На первый взгляд кажется, что в ней отсутствуют какие-либо составные поля. Но при более тщательном рассмотрении вы увидите, что InstrumentID на самом деле является составным полем. Значение, сохраненное в этом поле, представляет две отдельные части информации: категорию, к которой принадлежит инструмент, например AMP (усилитель), QUIT (гитара) и MFX (синтезатор), и его идентификационные номера. Эти два значения необходимо разделить и сохранить в своих собственных полях, чтобы гарантировать целостность данных. Представьте себе трудности корректировки этого поля, если категория MFX изменяется на MFU. Потребуется написать программу для грамматического разбора значения в этом поле и для проверки существования MFX, а затем для замены его на MFU, если он имеется в пределах синтаксически проанализированного значения.



Instruments

GU1T2201

Fender

Fender Stratocaster

MFX3349

Zoom

Player 2100 Multi-Effects

АМР1001

Marsha 1

JCM 2000 Tube Super Lead

АМР5590

Crate

VC60 Pro Tube Amp

li к

SFX2227

Ounbp

Cry Baby Wah-Wah

♦*

АМР2766

Fender

Twin Reverb Reissue

Рис. 2.4. Пример неявного составного поля

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

Дробление многозначных полей

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

В данном примере кавдый летчик имеет допуск к пилотированию некоторого количества самолетов. Эти допуски сохраняются в отдельном поле с именем Certifications. Способ сохранения данных в этих полях очень ненадежен, поскольку вы обречены сталкиваться с тем же типом проблем целостности данных, которые характерны для составных полей. При более внимательном рассмотрении данных можно увидеть, что трудно выполнять поиск и сортировку по этому ПОЛЮ в запросе SQL. Прежде чем разделить это поле соответствующим образом, необходимо понять действительные связи между многозначным полем и таблицей, к которой оно изначально относится.

Piiots

25100

John

Leverling

1994-0M1

727.737,757, MD80

25101

David

Callahan

1994-05*01

737.747,757

1**

25102

David

Smith

199Ф09-11

757. M080. DC9

25103

Kathryn

Patterson

1994-0M1

727.737,747. 757

л к

25104

Michael

Hernandez

199405-01

737.757, OC10

25105

Kendra

Bonnicksen

199409И1

757, MD80. DC9

Рис. 2.5. Пример многозначного поля



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

Для создания связывающей таблицы используйте многозначное поле и копию поля первичного ключа из исходной таблицы как основу д.1я новой таблицы. Присвойте новой связывающей таблице соответствующее имя и определите оба поля как составной первичный ключ (в данном случае это комбинация значений обоих полей, которые будут идентифицировать уникальным образом каждую запись в новой таблице). Теперь можно связать значение каждого из полей в связующей таблице на основе один-к-одному. На рис. 2.6 представлен пример этого процесса с использованием таблицы Pilots, показанной на рис. 2.5.

Pilots

1: >; . /

251 ОС

John

Leverling

1994-ОМ 1

25101

David

Callahan

1994-05-01

25102

David

Smith

1994-09-11

25103

Kathryn

Patterson

1994-07-11

t

25104

Michael

Hernandez

1994-05-01

4

25105

Kendra

Bonnicksen

1994-09-11

к

Pilot Certifications (таблица связей)

25100

8102

25100

.8103

25100

8105

25100

8106

25101

8103

25101

8104

25101

8105

Certifications

8102

Boeing 727

8103

Boeing 737

8104

Boeing 747

8105

Boeing 757

8106

McDonnell Douglas M080

Рис. 2.6. Разделение многозначного поля с использованием

связывающей таблицы



1 ... 6 7 8 [ 9 ] 10 11 12 ... 152

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика