Re: [pgsql-ru-general] несколько вопросов новичка (ограничения и индексы)

From: Dmitriy Igrishin <dmitigr(at)gmail(dot)com>
To: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: [pgsql-ru-general] несколько вопросов новичка (ограничения и индексы)
Date: 2011-02-21 11:57:34
Message-ID: AANLkTimy9V7e32mYiiG67h-_de+nBrZ52mDj5+Yxpz6a@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

21 февраля 2011 г. 12:42 пользователь Dmitry E. Oboukhov
<unera(at)debian(dot)org>написал:

>
> DI> Проектная задача тривиальна - отношение "многие ко многим", как
> DI> и её реализация - 3 таблицы: server, resource и server_resource.
> Последняя
> DI> таблица (кстати, называйте как хотите, все равно это не сущность,
> DI> а лишь способ реализации "многих ко многим") содержит 2 столбца,
> DI> которые - суть внешние ключи - один "смотрит" в server, другой -
> DI> в resource. Первичный ключ данной таблицы как раз состоит из этих 2-х
> DI> столбцов. Полезно также создать индекс на тот столбец, который
> DI> входит в первичный ключ вторым (оптимизация). Первичный ключ
> DI> (он же, на самом деле, просто сочетание огранчений уникальности
> DI> и недопустимости значений NULL) и обеспечит ограничение целостости.
> DI> Уверяю, что реализовать лучшее ограничение целостности написанием
> DI> триггерной функции не удастся, как бы не старались. Да и зачем?
> DI> Оптимизация? Боязнь JOINов ? :-)
>
> нормализованный вариант понятен. суть в том что по логике приложения
> будет получаться join будет делаться *всегда*, соответственно отсюда и
> стремление к денормализации
>
В любом случае, это не правильное стремление. Нормальные формы
позволяют минимизировать избыточность. Чем не оптимизиация?
Рассматривать оптимизацию только с одной стороны - "скорость выборки" -
это не правильно. Да и вообще, как можно что-то ускорять, не
проведя массу тестов, результаты которых окажутся неудовлетворительными?
"Оптимизация", ведущая к деградации дизайна БД, неразумна.
Если так уж не хочется выполнять аггрегацию данных при каждой выборке,
можно хранить готовый массив, например, в таблице server, который
генерируется каждый раз при выполнении операций над таблицей
server_resource. Для решения этой задачи потребуется написать
триггерную функцию и создать триггер на таблицу server_resource.
Этот массив следует расценивать как некий кэш.

>
> DI> Нормализация имеет смысл. Почему вообще такой вопрос встаёт?
> DI> Жалко создать таблицу? :-)
>
> опять та же оптимизация, если мы не делаем запроса без JOIN'а,
> следовательно есть смысл выкинуть его перенеся поля в основную
> таблицу.
>
> ну может мне MySQL'ный опыт мешает :)
>
Если это так уж критично, то лучше определить 2-х столбцовый
внешний ключ (например - id, name) в дочерней таблице и
установить режим каскадного обновления данных (ON UPDATE
CASCADE).

>
> --
> . ''`. Dmitry E. Oboukhov
> : :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
> `. `~’ GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
>

--
// Dmitriy.

In response to

Browse pgsql-ru-general by date

  From Date Subject
Next Message simplevolk 2011-02-24 17:49:00 Объектная модель данных
Previous Message Dmitry E. Oboukhov 2011-02-21 09:42:11 Re: несколько вопросов новичка (ограничения и индексы)