2015-05-28 2 views
0

рассмотреть следующий ERD для базы данных MySQL:Как ограничить определенные значения в столбце 2 тем же значением в столбце 1 в SQL?

Entity Relationship Diagram

роли таблица содержит все виды (сайт-специфические) ролей пользователей, которые вошли в систему может иметь. Как вы можете видеть из ERD: члены могут иметь несколько ролей, а роли могут иметь несколько членов, назначенных им.

Элементы таблицы динамичны, новые члены с настраиваемыми ролями могут быть сделаны в любое время, но таблица ролей - нет. Текущая настройка ролей является окончательной.

Записи внутри роли таблицы выглядят следующим образом:

 
id rolename 
1 captain 
2 cabin boy 
3 buccaneer 
4 parrot caretaker 
5 cook 

Теперь проблема: Я хочу, чтобы члены иметь определенные роли, назначенные для них, но некоторые комбинации ролей не могут быть выбраны. Например, капитан также не может быть мальчиком в кабине, но он также может быть смотрителем-попугаем. Повар может также быть мальчиком в каюте, но не смотрителем-попугаем.

Я провел некоторое исследование по Google в отношении этой темы, но, похоже, мне не удалось найти правильные ключевые слова, чтобы найти полезную информацию для решения этой проблемы. Кажется, что все, что я нашел, - это ссылки и руководства о том, как работает SQL CHECK, но не так глубоко.

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

+0

Это слишком широкое, чтобы ответить окончательно. Это зависит от того, сколько комбинаций допустимо, сколько комбинаций недопустимо и является ли (или оба) этих списков конечными. – Strawberry

+0

Я обновил свой вопрос с дополнительной информацией. Таблица правил конечна. В «реальной» базе данных имеется 9 комбинаций, которые не допустимы, из таблицы ролей с 13 записями (поэтому 9 из 169 комбинаций не допускаются). Если конкретные ограничения важны для того, чтобы знать, что я их положу. –

+0

Нет. Я думаю, что решение Арта находится вдоль правильных линий. Но, похоже, вам не нужен белый список, только черный список, который, как я полагаю, сохранит комбинации, используя абстрактную концепцию «comb_id» и член компонента этой запрещенной комбинации. Может быть, кто-то будет достаточно любезен, чтобы показать вам, как запросить это, поскольку это не совсем очевидно - или, может быть, я ... но солнце просто вышло ... – Strawberry

ответ

0

Это зависит от нескольких вещей ..

Хотите базы данных, чтобы справиться с этой логикой, или вы счастливы иметь его на уровне приложения?

Если вы хотите, чтобы база данных обрабатывала его, вам, вероятно, понадобится триггер. Mysql анализирует ограничение CHECK, но не применяет его.

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

Другой вариант - это таблица, необходимая для того, чтобы быть адмиралом, вы также должны быть капитаном.

+0

Я предпочитаю, какой из методов наиболее эффективен. Что вы подразумеваете под «анализирует ограничение CHECK, но не применяет его»? –

+0

Как в этом, вы можете вставить его, но он не будет его применять ... так что это бесполезно! – Arth

+0

Это будет более эффективно в базе данных, я считаю, но менее гибкой. Для сложных правил, которые могут измениться, у меня возникнет соблазн поставить его на уровень приложения. – Arth

Смежные вопросы