|
|
|
Перекрестная связь между таблицами БД
|
|||
|---|---|---|---|
|
#18+
Как обычно не буду задавать вопрос относительно своей БД, предпочту немного абстрагироваться. Допустим, что у нас имеется БД, в которой есть всего лишь 4 таблицы: Пользователи(куда включены и администраторы), Группы пользователей, Задачи, Доступ к задачам. В таблице "Пользователи" есть следующие поля: 1)ID_пользователя(Key1); 2)фамилия пользователя; 3)логин; 4)пароль; 5)наименование группы пользователей (связь с таблицей "Группы пользователей") ; 6)IsAdmin. Совокупность полей "ID_пользователя" и "фамилия пользователя" образуют еще один ключ(Key2) таблицы "Пользователи", что сделано для отображения столбца "фамилия пользователя" в других таблицах, связанных с этой. На 5 и 6 столбец повешено ограничение, согласно которому один из них должен иметь значение NULL. Таблица "Группы пользователей" состоит из нижеприведенных полей: 1)ID_администратора(ID_администратора - это переименованное поле ID_пользователя); 2)фамилия администратора(переименованное "фамилия пользователя"); 3)наименование группы пользователей(предполагается сделать его вместе ключевым полем); 4)дата создания. Таблица "Задачи": 1)ID_задачи; 2)название задачи; 3)смысл задачи; 4)условие задачи. "Доступ к задачам": 1)ID_задачи; 2)наименование группы пользователей. Условия работы БД: администраторы(IsAdmin=true) могут добавлять записи в "Группы пользователей", в "Доступ к задачам", "Задачи" и "Пользователи". В "Группы пользователей" добавляются записи вида:"Наименование группы", "Дата создания" и она нужна для того, чтобы только пользователи определенных группы могли просматривать данные об определенных задачах. Структуру абстрактной базы описал. Предполагается, что поле "фамилия пользователя" из таблицы "Пользователи" может меняться(например, неграмотный сотрудник заполнял БД, натворил кучу грамматических ошибок) и поэтому при изменении "фамилии пользователя" у администраторов значение поля "фамилия администратора" в таблице "Группы пользователей" также должно измениться. Т.к. администраторов предполагается включить в "Группы пользователей", то возникает перекрестная связь("Пользователи" (в лице администратора) -"Группы пользователей" и "Группы пользователей"-"Пользователи")=>cascade для Update и Delete сделать не получиться. Вместо "Cascade" возможно применить либо "Set NULL", либо "Restrict", либо "None", либо "Set Default". "None" не подходит по определению(изменили фамилию "Петров" в таблице "Пользователи" на "Иванов", а в таблице "Группы пользователей" она как была "Петров", так и останется). "Set Default" также не подходит. Стою перед выбором: либо установить для связи "Set NULL", либо "Restrict". Допустим, что избрал "Set NULL", но тогда мы не будем видеть фамилию нашего администратора после обновления, хотя она может быть нам нужна. По логике остается последний вариант "Restrict", но по причине того, что до текущего момента связи данного типа никогда не применял, не понимаю логику их работы, сможет ли данная связь удовлетворить мои потребности? Должного описания данного типа связи найти не удалось, поэтому я в смятении. Еще есть небольшая идея: повесить триггер на операции Update и Delete для таблицы "Пользователи" - для Delete проверять перед его выполнением наличие записей с соответствующим ID в таблице "Группы пользователей" и если такие есть, то генерировать ошибку; для Update обновлять соответствующие поля в таблице "Группы пользователей", если такие имеются. И последняя самая нежелательная методика решения: вынести администраторов в отдельную таблицу, в которой ликвидировать поле "Наименование группы пользователя", тогда цикл уйдет и мы сможем без проблем использовать простую связь "Restrict". Может кто-нибудь подсказать как лучше поступить, крайне не хочется следовать последней методике, хотя соглашусь, что может быть именно она и является наиболее рациональной? Прошу дать грамотную оценку по представленному вопросу и если создание дополнительной таблицы является "самым верным" решением, то прошу упомянуть о нем. Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2012, 10:40 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37780014&tid=1541704]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
54ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 332ms |

| 0 / 0 |
