Классика баз данных - статьи

       

Мы полагаем, что такая спецификация


Мы полагаем, что такая спецификация – не лучший выбор. В качестве иллюстрации рассмотрим пример: ALUMNI (name, age, address) GROUPS (g-name, composition)

Мы имеем коллекцию выпускников некоторого университета и коллекцию групп выпускников. У каждой группы есть имя, например, "старая гвардия", "непослушные дети", "переростки", и т.д.; в поле composition (состав) указаны все выпускники, являющиеся членами группы. Конечно, можно задать состав как массив указателей на соответствующих выпускников, однако такая спецификация окажется крайне неэффективной, так как множества окажутся довольно большими и будут значительно перекрываться. Более важно то, что когда новый человек добавляется к коллекции ALUMNI (выпускники), добавление его в соответствующую группу входит в обязанности прикладного программиста. Иными словами, различные множества выпускников задаются экстенсионально, перечислением членов, и принадлежность выпускника к какому-либо множеству определяется вручную прикладным программистом.

С другой стороны, можно представлять группы и в таком виде: GROUPS (g-name, min-age, max-age, composition)

В этом случае состав задается интенсионально, при помощи следующего выражения SQL: select * from ALUMNI where age > GROUPS.min-age and age < GROUPS.max-age

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

Помимо гарантированной согласованности, автоматически заданные множества обладают еще одним достоинством: они часто обеспечивают более высокую производительность, чем множества, заданные вручную. Предположим, пользователь выполняет такой запрос: select g-name from GROUPS where composition.name = "Bill"


Содержание  Назад  Вперед