Какой теоретический фундамент вы нашли для проектирования базы данных «Шаблон репозитория»? Я не угадал ни одного. Это сложный слой, основанный на поддельной предпосылке: «постоянный слой» - это то, от чего вам нужно быть изолированным. Судя по тому, что я могу сказать, это влияет на широко распространенное в программировании незнание принципов реляционного проектирования и способствует предполагаемой центральности разработки ОО приложения. Но это не оправдывает его существование на рациональных, не говоря уже о теоретических, основаниях.
Единый верный путь к проектированию базы данных не изменился за 30 лет: проанализируйте данные. Найдите ключи и ограничения, а также отношения многие-к-одному. Создайте свои столы в соответствии с обычной формой Бойса-Кодда. Используйте представления и хранимые процедуры для облегчения доступа к данным.
Хотя это может быть нелюбимым, СУБД SQL обеспечивает лучший уровень изоляции, чем все, что может предоставить программист. Это правда, что при изменении базы данных SQL, используемый для доступа к ней, может измениться. Но обратите внимание, что это так, независимо от того, существует ли посреднический уровень . Пока приложение использует представления и хранимые процедуры для доступа к СУБД, обычные средства разработки SQL будут указывать, когда изменения в базовой базе данных делают эти представления и хранимые процедуры недействительными.
В этом и заключается проблема, конечно. Посреднический уровень обеспечивает иллюзию изоляции и комфорт для программиста при написании кода, что он знает, как делать. Изучение дизайна базы данных и SQL требует изучения чего-то нового. Большинство людей предпочли бы умереть, чем думать, и многим это удалось.
Кто-то из вашей команды, несомненно, возразит, что написание SQL для поддержки ваших 200 классов - большая работа. Без сомнения. Но, по крайней мере, это полезная работа. Если вы проектируете базу данных, имитируя ваш ОО-проект, вы также будете выполнять большую часть работы, большая часть которой бесполезна, и побеждать большую часть того, что предлагает вам СУБД.
Например, вы рассматриваете возможность отражения единицы работы в базе данных (я полагаю, в виде таблицы или таблиц). Единица работы является встроенной службой СУБД: begin transaction
... обновление базы ... commit transaction
. Ничего не моделировать, кроме сопоставления ваших классов с таблицами базы данных в SQL.
Ваш вопрос был опубликован 4 года назад. Я отвечаю, потому что это было «обновлено» в некотором роде в последнее время, указывая, что это все еще представляет некоторый интерес для кого-то. Я надеюсь, что мой ответ побудит читателя применить базовую теорию отношений к проблеме вместо того, чтобы принять бессмысленный обходной путь.