В реальном мире вы моделируете набор бизнес-правил, которые сами по себе сложны. Поэтому неудивительно, что ваша модель будет сложной, независимо от того, как вы это делаете.
Я бы порекомендовал вам выбрать дизайн базы данных, который более точно описывает отношения, а не пытаться быть умным. Ваш умный дизайн может привести к меньшему количеству таблиц (хотя, на самом деле, не на порядок), однако вы компромисс - гораздо больше кода приложения для управления им.
Например, вы уже знаете, что это может вызвать замешательство у пользователей и дизайнеров отчетов. Еще одним недостатком является то, что столбец «тип отношения» содержит только значащие строки для сущностей, участвующих в отношениях. Например. имеет смысл сказать Bob IsMemberOf UserGroup4
, но что это значит, если CBO CanViewReportsOf Bob
? Также, как вы предотвращаете взаимоисключающие условия, такие как Bob IsMemberOf Company1
и Bob IsMemberOf Company2
?
Вы должны написать код приложения для проверки данных перед их вставкой и после извлечения (потому что ваш код никогда не может быть уверен, что другая часть кода не внесла ошибку целостности данных). Вам также может понадобиться написать код приложения для проверки качества всей базы данных и устранения аномалий при их возникновении.
Сравните с дизайном базы данных, в котором невозможно ввести недопустимые отношения, поскольку метаданные базы данных содержат ограничения, которые предотвращают это. Это значительно упростит код вашего приложения.
Вы также определяете иерархические права доступа, например, если Bob CanViewReportsOf Company1
, то сможет ли он просматривать отчеты какой-либо группы пользователей или CBO, являющейся членом этой компании? Или вам нужно ввести отдельную строку для отчетов каждой сущности, которые может прочитать Боб? Это проблемы политики, которые будут существовать независимо от того, какой дизайн вы используете.
Чтобы ответить на ваши комментарии:
Я, конечно, могу сочувствовать византийским случаям исключений и меняющимся требованиям, затрудняющим разработку простых решений.
Я работал над системами, которые пытались моделировать реальные политики, которые становились настолько сложными, что казалось глупым пытаться кодифицировать их в программном обеспечении. В конечном счете, клиент, нанявший меня, использовал бы свои деньги более эффективно, чтобы нанять одного или двух штатных административных помощников для отслеживания своих проектов с использованием бумаги и карандаша. Новые исключения, на которые у меня ушло несколько недель, чтобы внедрить их в программное обеспечение, заняли бы минуты, чтобы описать это АА.
Автоматизация сложнее, чем делать вещи вручную. Единственный способ автоматизации оправдан, если информация должна отслеживаться быстрее или с большим объемом, чем мог бы сделать человек.