Это шаблон дизайна учебника, или я изобрел что-то новое? - PullRequest
3 голосов
/ 15 июля 2009

Я только что разработал набор таблиц, в котором я придумал архитектуру, которая меня очень порадовала! Я никогда не видел его где-либо еще, поэтому я хотел бы знать, если я только что изобрел колесо (наиболее вероятное), или это подлинное новшество.

Вот формулировка проблемы: у меня есть Employees, каждый из которых может подписать свой контракт с компанией. Каждый сотрудник может выполнять различные действия, и у каждого действия может быть разная ставка оплаты, иногда фиксированная сумма за выполнение одного действия, иногда почасовая ставка, а иногда по многоуровневой ставке. Также может быть конкретный клиент, который особенно любит сотрудника, поэтому, когда он работает с этим конкретным клиентом, он получает более высокую ставку. И если ставка не определена, он получает ставку по умолчанию компании.

Не суетитесь о деталях: суть в том, что существует множество уровней оплаты, которые можно определить, причем каждый довольно сложным образом. И все ставки заработной платы имеют следующие общие черты:

  • Тип услуги
  • Тип шкалы оплаты (Перечисление: фиксированная сумма / Почасовая ставка / Уровень многоуровневой)
  • Фиксированная сумма (если PayScaleType = FA)
  • Почасовая ставка (если PayScaleType = HR) - да, может быть объединена в одно поле, но по причинам, которые я здесь не буду описывать, я их разделила
  • Уровни (1-> n отношений, со всеми уровнями и суммой, которую нужно заплатить, когда вы превысите пороговое значение уровня)

Данные ставки применяются к:

  • ставка по умолчанию для компании
  • Рейтинг сотрудников
  • Коэффициент отмены сотрудника (определяется для каждого клиента)

Если бы мне пришлось следовать простому подходу грубой силы, мне пришлось бы создать таблицу клонов PayRate и PayRateTier для каждой из трех таблиц выше, а также соответствующие им классы Linq, а также логику для расчета ставок в 3 отдельных места, как-то рефакторинг для повторного использования логики расчета. Тьфу. Это похоже на использование копирования и вставки только в базе данных.

Итак, что я сделал? Я создал промежуточную таблицу, которую я назвал PayRatePackage, состоящую только из поля идентификатора. У меня есть только одна PayRate таблица с обязательным FK до PayRatePackage и таблица PayRateTier с обязательным FK до PayRate. Затем DefaultCompanyPayRate имеет обязательный FK для PayRatePackage, как и EmployeeRate и EmployeeOverrideRate.

Так просто - и все работает!

(Простите за то, что я не прикреплял диаграммы; это было бы большим усилием, чтобы перейти к такому вопросу, на котором я уже решил основную проблему. Если многие люди хотят видеть диаграмму, скажите, пожалуйста, в комментарии, и я скину что-нибудь вместе.)

Теперь, я почти уверен, что что-то такое простое и эффективное должно быть где-то в официальной схеме проектирования, и я бы хотел знать, что это такое. Или я просто изобрел что-то новое? :)

Ответы [ 2 ]

6 голосов
/ 15 июля 2009

Я почти уверен, что это шаблон стратегии

«Определите семейство алгоритмов, инкапсулируйте каждый и сделайте их взаимозаменяемыми. Стратегия позволяет алгоритму отличаться независимо от клиентов, которые его используют».

5 голосов
/ 15 июля 2009

Звучит как реляционная база данных для меня. Вы разбили конкретную логику на конкретные сущности и вернули их обратно в исходные таблицы ... Стандартная нормализация ...

...