Многоуровневые справочники
От: ValeriySP  
Дата: 20.06.04 07:30
Оценка:
При проектировании базы данных возник вопрос: как правильно организовать многоуровневые справочники? и нужны-ли они вообще.
Предположим есть таблица [контакт] и таблица [вид контакта]. Связь между ними один ко многим, т.е у контакта есть поле (вид), связанное с таблицей видов. Однако, здесь необходимо четко продумать иерархию видов. Например:
вх. звонок – семинар
– обучение — заявка
— отзыв
визит — обучение
— презентация
Это вариант первый.
Но вот появляется контакт, котрый сочетает в себе несколько видов. Как быть? Усложнять иерархию видов – нет желания. Можно вынести все виды в один неиерархический список и ввести новую промежуточную таблицу:

          +----+--------------+---------+
          | id | вид_контакта | контакт |
          +----+--------------+---------+
          | 1  | вх. звонок   | первый  |
          +----+--------------+---------+
          | 2  | обучение     | первый  |
          +----+--------------+---------+
          | 3  | вх. звонок   | второй  |
          +----+--------------+---------+
          | 4  | семинар      | второй  |
          +----+--------------+---------+
          | 5  | отзыв        | второй  |
          +----+--------------+---------+ и т.д.

Это вариант второй.
Ну и третий вариант. В таблице [контакт] поле (вид) рассматривать как набор битов – те из них которые включены и определяют тип контакта.

           +------------вх. звонок
           | +----------исх. звонок
           | |          ...
           | |     +----обучение
           | |     |    ...
          +-+-+-+-+-+-+-+   +-+
          |1|0|0|0|1|0|0|...|0|
          +-+-+-+-+-+-+-+   +-+


У воторого и третьего варианта есть недостаток по отношению к первому — появляется возможность занесения в таблицу несовместимых видов (допустим вх. звонок и исх. звонок одновременно). Или отдать это на откуп пользователям?

Буду благодарен за любые мысли, ссылки на книги, сайты.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.