|
|
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
Иногда приходится сталкиваться с такими ситуациями, что описал предметную область сущностями, спроектировал таблицы, и тут выясняется, что буквально одна-две строки (объектов предметной области) немного вылезает за принятые упрощения. Вроде бы и игнорировать это нельзя, но и "всеобщую теорию всего" ради мелочи в схему базы вгонять не хочется. Для определенности, пример. Описываем схему государственного документооборота племени Мумба-Юмба. Три таблицы: документ, тип документа (закон, постановление, приказ, решение, письмо...), и издатель документа (вождь, совет племени, шаман, палач, казначей). Все бы замечательно, но выясняется: Закон может издать только Вождь. Все остальные типы документов - кто угодно. Но может выяснится что-то еще подобное. Требуется: 1. Обеспечить непротиворечивость данных в таблице документов, чтобы не прошел Закон от Шамана. 2. В интерфейсе при редактировании и выборе документа по типу и издателю, при выборе "Закон", пользователю должен быть доступен исключительно Вождь. Напрашиваются решения: 1. В лоб, декларативно. Поскольку выяснилась зависимость типа документа от издателя, делаем таблицу "Допустимые типы документов от издателей", со ссылками на тип и издателя, а документ будет ссылаться уже на эту таблицу. Все железно, но очень неудобно: эта таблица практически будет декартовым произведением всех типов и издателей (за исключением Закона-Вождя). При добавлении нового типа или издателя - множить декартово произведение. 2. Чисто процедурно: вешаем триггер на Документ, разрешающий сохранение Законов только от Вождя, и в формах выбора документа вшиваем код "Если в комбобоксТип выбран ЗаконИд, то комбобоксИздатель := ВождьИд и комбобоксИздатель.Disable". Недостаток - размазывание декларативного по сути ограничения по коду, с константами данных, вшитыми в код. У меня на это некоторая аллергия. Интересен опыт: сталкивались ли вы с подобными случаями, и как обходили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2010, 16:19 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherИногда приходится сталкиваться с такими ситуациями, что описал предметную область сущностями, спроектировал таблицы, и тут выясняется, что буквально одна-две строки (объектов предметной области) немного вылезает за принятые упрощения. Вроде бы и игнорировать это нельзя, но и "всеобщую теорию всего" ради мелочи в схему базы вгонять не хочется. Для определенности, пример. Описываем схему государственного документооборота племени Мумба-Юмба. Три таблицы: документ, тип документа (закон, постановление, приказ, решение, письмо...), и издатель документа (вождь, совет племени, шаман, палач, казначей). Все бы замечательно, но выясняется: Закон может издать только Вождь. Все остальные типы документов - кто угодно. Но может выяснится что-то еще подобное. Требуется: 1. Обеспечить непротиворечивость данных в таблице документов, чтобы не прошел Закон от Шамана. 2. В интерфейсе при редактировании и выборе документа по типу и издателю, при выборе "Закон", пользователю должен быть доступен исключительно Вождь. Напрашиваются решения: 1. В лоб, декларативно. Поскольку выяснилась зависимость типа документа от издателя, делаем таблицу "Допустимые типы документов от издателей", со ссылками на тип и издателя, а документ будет ссылаться уже на эту таблицу. Все железно, но очень неудобно: эта таблица практически будет декартовым произведением всех типов и издателей (за исключением Закона-Вождя). При добавлении нового типа или издателя - множить декартово произведение. А что, так много типов и издателей, что это может вызвать неудобство ? Cane Cat Fisher 2. Чисто процедурно: вешаем триггер на Документ, разрешающий сохранение Законов только от Вождя, и в формах выбора документа вшиваем код "Если в комбобоксТип выбран ЗаконИд, то комбобоксИздатель := ВождьИд и комбобоксИздатель.Disable". Недостаток - размазывание декларативного по сути ограничения по коду, с константами данных, вшитыми в код. У меня на это некоторая аллергия. Интересен опыт: сталкивались ли вы с подобными случаями, и как обходили? Я в такой ситуации однозначно выбираю решение (1) (декларативное), потому что: 1. Декларативное в общем лучше процедурного (триггер). 2. Если нужно изменить правила, то в случае (1) нужно изменить данные в таблице, а в случае (2) изменить код триггера и перекомпилировать его. (1) может сделать и пользователь, а (2) только программист, поэтому решение (1) дешевле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2010, 16:51 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
предлагаю первый вариант в модификации: "Допустимые типы документов от издателей" если нет в ней ни одной записи с данным типом документа, то разрешено всем, если есть, то только тем о ком есть запись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2010, 17:00 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
Возможен промежуточный вариант - создать таблицу правил и процедурно (триггером в сложных случаях не получится, так что либо в ХП, либо на клиенте) при внесении изменений по ней проверять, возможны ли такие изменения или нет (в случае, если нет, то должно быть выдано некое сообщение с объяснением "почему так нельзя"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2010, 17:32 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
Кстати, вариант 1 работает только в случае неуменьшения прав с течением времени. Например, запретит Вождь Палачу выдавать справки о смерти, а разрешит только наблюдающему за казнью Шаману. А старые-то справки, выданные Палачом, в системе должны остаться. P.S. примерчик у топикстартера весьма живописный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2010, 17:36 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
miksoftКстати, вариант 1 работает только в случае неуменьшения прав с течением времени. Например, запретит Вождь Палачу выдавать справки о смерти, а разрешит только наблюдающему за казнью Шаману. А старые-то справки, выданные Палачом, в системе должны остаться. Можно в таблицу, где хранятся права, добавить еще одну колонку, показывающую, активно ли это право или нет. В этом случае на клиенте можно показывать только список активных в данный момент прав и пользователь может выбирать только из него. (Конечно, это не защитит базу данных от использования старых правил другим путем, например, вследствие изменения данных какой-нибудь автоматизированной процедурой). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2010, 18:09 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher 1. В лоб, декларативно. Поскольку выяснилась зависимость типа документа от издателя, делаем таблицу "Допустимые типы документов от издателей", со ссылками на тип и издателя Я бы, скорее, выбрал этот вариант ("всякое исключение из правил есть частный случай правила более общего" :) ) Cane Cat Fisherа документ будет ссылаться уже на эту таблицу. А это лучше не делать. Таблицы с данными лучше себя чувствуют отдельно от таблиц с метаданными (разрешениями). Cane Cat Fisherочень неудобно: эта таблица практически будет декартовым произведением всех типов и издателей Вероятно, ее нужно будет заполнить только один раз? Если у должностей Шаман, Вождь и проч. что-то часто меняется, можно попробовать выделить <i>роли</i> ("Издатель законов", "Издатель подзаконных актов", "Издатель приказов и распоряжений"...) и назначать их? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2010, 18:13 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
On 18.10.2010 17:19, Cane Cat Fisher wrote: > Все бы замечательно, но выясняется: Закон может издать только Вождь. Все > остальные типы документов - кто угодно. Но может выяснится что-то еще подобное. Это типичные business rules, они же -- бизнес-правила. Чаще всего не влияют на схему данных и реализуются логикой приложения, лучше всего в БД, с помощью правил, триггеров, процедур. > Недостаток - размазывание декларативного по сути ограничения по коду, с > константами данных, вшитыми в код. У меня на это некоторая аллергия. > Интересен опыт: сталкивались ли вы с подобными случаями, и как обходили? Так это сплош и рядом встречается в БД, чего у тебя аллергия -- не понятно. Сделал триггер и забыл. А в решении чисто на данных проблем ещё больше -- если добавляются новые виды людей и документов -- надо добавлять разрешительные записи для всех них. А как понимать, что можно разрешать, а что нет ? О, пишем триггер и процедуру с правилами. А на кой мы тогда данные храним, елси всё равно надо триггер или процедуру писать ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2010, 19:07 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
Flying Dutchman1. Декларативное в общем лучше процедурного (триггер).А чем? И самое интересное - все ли можно "задекларировать"?Flying Dutchman2. Если нужно изменить правила, то в случае (1) нужно изменить данные в таблице, а в случае (2) изменить код триггера и перекомпилировать его. (1) может сделать и пользователь, а (2) только программист, поэтому решение (1) дешевле.Дешевизна решения (1) под большим вопросом. К тому же как быть, если новое правило напрочь перечеркивает старое? Если уж начали про племя Мумба-Юмба... Хотя на это уже указывал miksoftmiksoftКстати, вариант 1 работает только в случае неуменьшения прав с течением времени. Например, запретит Вождь Палачу выдавать справки о смерти, а разрешит только наблюдающему за казнью Шаману. А старые-то справки, выданные Палачом, в системе должны остаться. KewCane Cat Fisherочень неудобно: эта таблица практически будет декартовым произведением всех типов и издателей Вероятно, ее нужно будет заполнить только один раз? Если у должностей Шаман, Вождь и проч. что-то часто меняется, можно попробовать выделить <i>роли</i> ("Издатель законов", "Издатель подзаконных актов", "Издатель приказов и распоряжений"...) и назначать их?А проверять будем... да! конечно же программно - в ХП или в триггере ;) Имхо, пожалуй, самая здравая идея. К тому же изобретать придется поменьше: ACL и другие схемы разграничения доступа уже разработаны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2010, 20:57 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
a клиент-то что-ли тонкий, только ХП дергает с сервера? Если толстый, то вся подобная бизнес-логика должна быть в доменной модели ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2010, 02:25 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher Закон может издать только Вождь. Все остальные типы документов - кто угодноТо есть вам нужно засунуть куда-нибудь этот кусок кода типа функции проверки(ИдТипаДокумента,ИдИздателя). Код: plaintext 1. 2. Причем вы также можете (должны) реализовать это на клиенте (например дергая функцию из приложения), чтобы не напрягать пользователя красными окошками (в случае check оно еще требует специального кода для перехвата, а то сообщение будет совсем нечитабельное типа check constraint_vozhd_zakon is violated) Таким образом код сам по себе будет жить в одном месте, во всех местах программы будет только ссылка на него, пользователи могут рулить флагами как хотят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2010, 06:26 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
Если всех пускать в базу только через хранимые процедуры и функции, то тут же можно и проверять сколь угодно сложную бизнес логику - можно только членам племени, у которых имя начинается на букву А и они ростом не выше 170 см. Но все же основные изменения нужно вносить видимо и в структуру БД, потому что в ином случае обвес бизнес-логики на программируемой части будет слишком велик и может потопить систему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2010, 07:14 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
MasterZiv, попытаюсь объяснить, почему у меня аллергия на процедуры с вшитыми дата-константами. Пусть мы внедрили систему на острове Мумба-Юмба. Но заинтересовался соседний остров Чунга-Чанга - и мы хотим такое; только бизнес-правила у нас немного другие: у нас есть тип документа "Решение суда", и издавать его могут только издатели "Перцовый суд", "Крапивный суд" и "Высший Колповный суд". Отбросив навязчивые мысли об особенностях туземного правосудия, сделаем вывод: придется переписать и серверную процедуру, проверяющую данные при сохранении, и клиентский кусочек, "образумливающий" интефейс при выборе типов-издателей. То есть вести отдельную серверную и клиентскую части для каждого острова. И не дай Бог перепутать - претензии рассматриваются в судах заказчика!!! А в случае с таблицами - просто меняем содержимое настроечной таблицы. Мне больше всего понравилась идея от Naf - Naf первый вариант в модификации: "Допустимые типы документов от издателей" если нет в ней ни одной записи с данным типом документа, то разрешено всем, если есть, то только тем о ком есть запись Другими словами - таблица "Допустимые издатели для документов с ограниченным набором издателей". Преимущества: Во-первых, она не будет декартовым произведением всех дозволенных комбинаций, а будет небольшой и обозримой: одна запись "Закон-Вождь" для Мумба-Юмба, три записи с судами для Чунга-Чанга. Во-вторых, серверный и клиентский код, который опирается на эту таблицу, может быть сколь угодно сложным, но из него исчезают конкретные константы: код клиента и сервера становится полностью одинаковым для обеих племен. Ради этого стоит жить и бороться! И совершенно справедливое замечание miksoft о превратности суетности и изменчивости бизнес-правил во времени, мне кажется, красивее учесть введением дат актуальности в таблицах, как мудро указывал нам Flying Dutchman, чем синхронными CASE-изгородями в клиентском и серверном коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2010, 11:23 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher, для данного, конкретного случая может быть и да. Если верно понял, изначально вопрос ставился в общем плане. Данный частный случай имхо не может служить общей характеристикой методов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2010, 11:33 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
On 19.10.2010 12:23, Cane Cat Fisher wrote: > Пусть мы внедрили систему на острове Мумба-Юмба. Но заинтересовался соседний > остров Чунга-Чанга - и мы хотим такое; только бизнес-правила у нас немного > другие: у нас есть тип документа "Решение суда", и издавать его могут только > издатели "Перцовый суд", "Крапивный суд" и "Высший Колповный суд". Ну всё правильно ты мыслишь, только учти и проблемы, возникающие при твоём чисто на данных решении, о которых я тебе писал. А Бизнес-правила тоже можно настраивать метаданными и настройками. Главное просто понять, что в данном конкретном случае проще делать. В случаях как ты описал, где правила формулируются в стиле исключений, думаю, больше поднодит реализация в виде БЛ, кодом, в случаях, когда правила применяются всегда и для каждого случая -- лучше данными, естественно. > Отбросив навязчивые мысли об особенностях туземного правосудия, сделаем вывод: > придется переписать и серверную процедуру, проверяющую данные при сохранении, и > клиентский кусочек, "образумливающий" интефейс при выборе типов-издателей. То Да нет, достаточно её просто настраивать. Метаданными. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2010, 12:08 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
> Пусть мы внедрили систему на острове Мумба-Юмба. Но заинтересовался соседний остров Чунга-Чанга Похоже, вы описываете реальное состояние одного из национальных проектов. Грустно, поскольку мне так или иначе придется столкнуться с этим в реальной жизни. Вам было бы правильнее тренироваться на кошках. Жаль, что вы ничего не слышали об административном и административно-территориальном делении, жаль, что вы ничего не слышали о маршрутах, контурах и шаблонах. Не удивляет, что в оценке количества необходимых таблиц вы ошиблись на пару-тройку порядков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2010, 15:50 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher Пусть мы внедрили систему на острове Мумба-Юмба. Но заинтересовался соседний остров Чунга-Чанга - и мы хотим такое; только бизнес-правила у нас немного другие: у нас есть тип документа "Решение суда", и издавать его могут только издатели "Перцовый суд", "Крапивный суд" и "Высший Колповный суд".Проставите флажки в нужных типах документа. В худшем случае (если придется лазить по другим таблицам обновите проверяющую функцию) Cane Cat Fisher Отбросив навязчивые мысли об особенностях туземного правосудия, сделаем вывод: придется переписать и серверную процедуру, проверяющую данные при сохранении, и клиентский кусочек, "образумливающий" интефейс при выборе типов-издателей. Клиентский кусочек переписывать не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2010, 17:12 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
guest_20040621 Не удивляет, что в оценке количества необходимых таблиц вы ошиблись на пару-тройку порядков. А что, для государственного документооборота еще какие-то таблицы нужны? Мне об этом ничего не сказали... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2010, 10:29 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
> А что, для государственного документооборота еще какие-то таблицы нужны? Для любого документооборота. > Мне об этом ничего не сказали... Значит, задачи вам формулируют бараны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2010, 12:34 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher, Вы все правильно понимаете. Делайте таблицу с разрешенными документами для издателя - это и теоретически и практически правильно, хотя понятное дело и несовсем удобно. Но поскольку неудобно только спать на потолку, то со всем остальным можно смириться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2010, 13:17 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
guest_20040621> Пусть мы внедрили систему на острове Мумба-Юмба. Но заинтересовался соседний остров Чунга-Чанга Похоже, вы описываете реальное состояние одного из национальных проектов. Грустно, поскольку мне так или иначе придется столкнуться с этим в реальной жизни. Вам было бы правильнее тренироваться на кошках. Жаль, что вы ничего не слышали об административном и административно-территориальном делении, жаль, что вы ничего не слышали о маршрутах, контурах и шаблонах. Не удивляет, что в оценке количества необходимых таблиц вы ошиблись на пару-тройку порядков. По моему весьма "толсто". И без намека за собственную позицию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2010, 13:27 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
> И без намека за собственную позицию. Все предельно прозрачно: нефиг заниматься тем, о чем нет ни малейшего понятия. Мне было бы стыдно получать зарплату за собственное невежество. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2010, 14:54 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
guest_20040621> И без намека за собственную позицию.Все предельно прозрачно: нефиг заниматься тем, о чем нет ни малейшего понятия. Мне было бы стыдно получать зарплату за собственное невежество. и сразу пример невежества в студию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2010, 16:03 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
> и сразу пример невежества в студию. Дружище, если вы не видите очевидного, обсуждать нам не просто нечего, а категорически нечего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2010, 21:38 |
|
||
|
Исключения из правил
|
|||
|---|---|---|---|
|
#18+
guest_20040621> А что, для государственного документооборота еще какие-то таблицы нужны? Для любого документооборота.> Мне об этом ничего не сказали...Значит, задачи вам формулируют бараны. Что вы ко всему придираетесь? Я уже все почти сделал, только никак не пойму, как внешние ключи направить. А за зарплату зря упрекаете, хоть я и понимаю, что вам завидно. Просто нам выделили большой грант на автоматизацию документооборота министерства, а в понедельник приезжает начальник, и нужно чтоб все готово было. А тут эти внешние ключи. Подскажите, что тут поправить? Да, и делать буду в Access97, а то там компьютеры очень старые, да и книжка у меня только про него нашлась. Или все-таки выбрать Paradox for Windows? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2010, 10:44 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36905681&tid=1542344]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
413ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 295ms |
| total: | 769ms |

| 0 / 0 |
